تخطَّ إلى المحتوى

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)
الفرق عن CommandCommand يعكس عملية بمنطق يدوي؛ Memento يستعيد لقطة كاملة من الحالة

💡 نصائح عملية

  • ضع حدًا لعدد اللقطات المحفوظة (مثلاً آخر 50) بدل الاحتفاظ بالتاريخ كاملًا — يستهلك ذاكرة بسرعة

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار OOP الكامل بالعربي.