آموزش دیزاین پترن Memento در گولنگ

📌 دیزاین پترن Memento چیه؟

اگر در برنامه‌ای نیاز به قابلیت Undo/Redo یا ذخیره تاریخچه وضعیت یک شی داشته باشید، این الگو به کمک شما می‌آید. به جای ذخیره مستقیم وضعیت در بیرون از کلاس، از یک Memento (حافظه موقت) برای نگهداری اطلاعات استفاده می‌شود.


🎯 اجزای اصلی در Memento دیزاین پترن

  • Originator → شی‌ای که می‌خواهیم وضعیتش را ذخیره و بازگردانی کنیم.

  • Memento → کلاس نگهدارنده وضعیت شی بدون افشای جزئیات داخلی.

  • Caretaker → مدیر Mementoها که چندین نسخه از وضعیت را ذخیره و در صورت نیاز بازیابی می‌کند.


✨کاربردهای این الگو

  • پیاده‌سازی قابلیت Undo/Redo در ویرایشگرهای متن، فرم‌ها و نرم‌افزارهای گرافیکی.

  • ذخیره‌سازی وضعیت بازی‌ها در هر مرحله و بازگرداندن آن.

  • مدیریت تنظیمات کاربر و امکان بازگردانی تغییرات.

👩‍💻 مثال دیزاین پترن Memento در گولنگ

package main

import "fmt"

// Memento ذخیره‌کننده وضعیت
type Memento struct {
    state string
}

// Originator که وضعیتش ذخیره می‌شود
type Originator struct {
    state string
}

func (o *Originator) SaveToMemento() Memento {
    return Memento{state: o.state}
}

func (o *Originator) RestoreFromMemento(m Memento) {
    o.state = m.state
}

func (o *Originator) SetState(state string) {
    o.state = state
}

func (o *Originator) GetState() string {
    return o.state
}

// Caretaker برای نگهداری Mementoها
type Caretaker struct {
    history []Memento
}

func (c *Caretaker) Add(m Memento) {
    c.history = append(c.history, m)
}

func (c *Caretaker) Get(index int) Memento {
    return c.history[index]
}

func main() {
    originator := Originator{}
    caretaker := Caretaker{}

    originator.SetState("State 1")
    caretaker.Add(originator.SaveToMemento())

    originator.SetState("State 2")
    caretaker.Add(originator.SaveToMemento())

    originator.RestoreFromMemento(caretaker.Get(0))
    fmt.Println("Restored State:", originator.GetState()) // Output: Restored State: State 1
}

در اینجا ما اومدیم وضعیت قبلی Originator داخل آبجکت Memento ریختیم و همینطور یک تاریخچه داریم به نام Caretaker که وضعیت های قبلی Memento ذخیره میکنه و هر زمان که بخواید میتونید بهش دسترسی داشته باشید.

0 🔥
0 🎉
0 😮
0 👍
0 💜
0 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁