1. ما هو نمط المحفظة (Memento Pattern)
نمط المحفظة (Memento Pattern) هو نمط تصميم سلوكي يُستخدم لحفظ واستعادة الحالة الداخلية لكائن. يُحفظ حالة الكائن في كائن محفظة (memento)، الذي يمكن استخدامه لاستعادة الكائن إلى حالة سابقة في المستقبل.
2. الخصائص والمزايا لنمط المحفظة (Memento Pattern)
الخصائص والمزايا لنمط المحفظة (Memento Pattern) تشمل:
- يمكنه حفظ واستعادة الحالة الداخلية لكائن دون انتهاك مبدأ التجريع (encapsulation).
- يمكنه إدارة حالات الكائن التاريخية بشكل مرن، مما يجعله ملائمًا لأداء عمليات التراجع وإعادة القيام.
- يسمح بحفظ الحالة خارجيًا، مما يتجنب تعريض الحالة الداخلية للكائن.
3. أمثلة لتطبيقات عملية لنمط المحفظة (Memento Pattern)
نمط المحفظة (Memento Pattern) له العديد من سيناريوهات التطبيق العملية، ومن أمثلتها:
- وظيفة التراجع وإعادة القيام في محررات النصوص، التي يمكن استخدام نمط المحفظة لحفظ حالة كل عملية.
- وظيفة حفظ وتحميل الألعاب، التي يمكن استخدام نمط المحفظة لحفظ تقدم اللعبة.
- ميزة حفظ المسودات في عملاء البريد الإلكتروني، التي يمكن استخدام نمط المحفظة لحفظ حالة رسائل البريد الإلكتروني.
4. تنفيذ نمط المحفظة في جو لانج (Golang)
4.1. رسم الصنف لـ نمط المحفظة (Memento Pattern) في جو لانج (Golang)
4.2. مقدمة عن المثال
الوصف بناءً على رسم الصنف لـ نمط المحفظة
في هذا المثال، لدينا فئة Originator بحالة داخلية تسمى "state". يقوم الـ Originator بتعيين الحالة باستخدام طريقة SetState وإنشاء كائن محفظة باستخدام طريقة CreateMemento. تكون الحالة الداخلية لكائن الـ memento نفسها كحالة الـ Originator. فئة الـ Caretaker مسؤولة عن حفظ كائن المحفظة وإضافة المحافظ.
خطوات التنفيذ
- إنشاء كائن Memento الذي يحتوي على طريقة GetState لحفظ الحالة الداخلية للـ Originator.
- إنشاء كائن Originator الذي يحتوي على طرق لتعيين الحالة وإنشاء كائن محفظة.
- إنشاء كائن Caretaker مسؤول عن حفظ كائن المحفظة.
- تنفيذ الطرق لإنشاء محفظة واستعادة الحالة في الـ Originator:
- عند إنشاء كائن المحفظة، قم بحفظ حالة الـ Originator في المحفظة.
- عند استعادة الحالة، قم بإعادة الحالة من المحفظة إلى الـ Originator.
- تنفيذ الطرق لإضافة المحفظة والحصول على المحفظة في الـ Caretaker:
- يُستخدم طريقة إضافة المحفظة لحفظ كائن المحفظة في الـ Caretaker.
- يُستخدم طريقة الحصول على المحفظة لاسترجاع كائن المحفظة من الـ Caretaker.
4.3.1. إنشاء كائن Memento
type Memento struct {
state string
}
func (m *Memento) GetState() string {
return m.state
}
4.3.2. حفظ الحالة في المحفظة
type Originator struct {
state string
}
func (o *Originator) SetState(state string) {
o.state = state
}
func (o *Originator) CreateMemento() *Memento {
return &Memento{state: o.state}
}
4.3.3. استعادة الحالة من المحفظة
func (o *Originator) SetMemento(memento *Memento) {
o.state = memento.GetState()
}
4.3.4. استخدام نمط المحفظة لعمليات التراجع
type Caretaker struct {
mementos []*Memento
}
func (c *Caretaker) AddMemento(m *Memento) {
c.mementos = append(c.mementos, m)
}
func (c *Caretaker) GetMemento(index int) *Memento {
return c.mementos[index]
}
4.3.5. استخدام نمط Memento لعمليات إعادة القيام
func main() {
originator := &Originator{}
caretaker := &Caretaker{}
originator.SetState("الحالة 1")
caretaker.AddMemento(originator.CreateMemento())
originator.SetState("الحالة 2")
caretaker.AddMemento(originator.CreateMemento())
originator.SetMemento(caretaker.GetMemento(0))
fmt.Println("حالة المنشئ بعد استعادة الحالة ١:", originator.state)
originator.SetMemento(caretaker.GetMemento(1))
fmt.Println("حالة المنشئ بعد استعادة الحالة ٢:", originator.state)
}