Memento
نمط اللقطة التذكارية Memento
Memento يلتقط لقطة من الحالة الداخلية لكائن (Originator) ويحفظها خارجه، ليُستعاد لاحقًا لتلك الحالة دون كشف تفاصيله الداخلية.
ثلاثة أدوار: الـ Originator (الكائن نفسه) هو الوحيد القادر على إنشاء واستعادة اللقطة من حالته؛ الـ Memento لقطة لا يقرأ محتواها أي كائن غير من أنشأها؛ والـ Caretaker يحتفظ باللقطات (غالبًا بمكدّس) دون رؤية محتواها. أساس ميزات Undo التي تحتاج استعادة حالة كاملة معقّدة، لا مجرد عكس عملية واحدة.
الصياغة
const snapshot = originator.save(); // ... تغييرات لاحقة originator.restore(snapshot);
📄 مثال
class Editor {
content = "";
save() { return { content: this.content }; } // Memento
restore(m) { this.content = m.content; }
}
class History {
#snapshots = [];
backup(editor) { this.#snapshots.push(editor.save()); }
undo(editor) { const s = this.#snapshots.pop(); if (s) editor.restore(s); }
}
const editor = new Editor();
const history = new History();
history.backup(editor);
editor.content = "مرحبا";
history.undo(editor);
console.log(editor.content); // ""أهم النقاط
| النقطة | الوظيفة |
|---|---|
| التصنيف | نمط سلوكي (Behavioral) |
| يحل مشكلة | استعادة حالة كائن معقدة سابقة دون كسر التغليف (encapsulation) |
| الفرق عن Command | Command يعكس عملية بمنطق يدوي؛ Memento يستعيد لقطة كاملة من الحالة |
💡 نصائح عملية
- ضع حدًا لعدد اللقطات المحفوظة (مثلاً آخر 50) بدل الاحتفاظ بالتاريخ كاملًا — يستهلك ذاكرة بسرعة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار OOP الكامل بالعربي.