الگویِ طراحیِ Memento (جاوا و کاتلین)

تا حالا شما بگید "عه ، این چه کاری بود کردم" و آرزو می‌کردید زمان برمی‌گشت تا بتونید وضعیت اون موقعتون رو داشته باشید ؟ خلاصه بگم Memento دقیقا همین کار رو می‌کنه ! Memento در لغت به معنی یادآوری میشه ، ما هم در این الگو به گذشته و حالت‌هایِ (State) قبلیِ شئ برمی‌گردیم . فایده استفاده از این الگو در عملیاتی مثل undo یا تهیه Log ای از سوابق اعمال بر روی شئ یا ... هست .

در این الگو چند بخش داریم :

Originator

شئ‌ای هست که قصد داریم Memento رو روش اعمال کنیم و بعدا بتونیم بازیابیش کنیم

Memento

کلاسی که شامل اطلاعاتِ مورد نظره که قراره بازیابی بشه

Caretaker

کلاسی که فرمان به عملیاتِ بازیابی میده

شِمایِ کلی قضیه به صورتِ زیره :

طبقِ این UML ما این طور عمل می‌کنیم که کلاسِ Caretaker شئ Memento رو در اختیار خودش داره و Memento و Originator با هم این سابقه رو تهیه می‌کنند .

صورت مساله

در کلیپ بورد گوشی متون مختلفی وجود دارند ، با Memento کدی می‌نویسیم که بتواند به همه‌ی این متون دسترسی پیدا کنه و بتونه آخرین متن رو حذف کنه (مثلا معادل undo)

اول از همه Originator ، Originator در اینجا کلاسی به اسم ClipBoard میشه که در هر لحظه فقط یک متن رو در خودش داره ، کلاس Memento ما باید مقادیر مورد نیاز از ClipBoard رو داشته باشه که اینجا فقط یه String هست ، فرض می‌کنیم در ClipBoard متغیر دیگه‌ای جز String هم هست به اسم dataSize که طولِ اون رشته رو نگه میداره ، این متغیر رو لزومی نداره در Memento بیاریم چون با دسترسی به String می‌تونیم بعدا بدستش بیاریم (پس لازم نیست حافظه بی‌خودی بهش اختصاص بدیم) ، تابعی به نام copy در ClipBoard ایجاد می‌کنیم که وظیفه‌اش مقدار دهی String هست :

https://gist.github.com/sasssass/e21613eefc9fe64aefcc171d80d26c92

حالا نوبت به Caretaker می‌رسه که وظیفه‌اش انجام عملیاتِ گرفتن دیتاهاست ، در این کلاسِ لیستی از Memento رو داریم که می‌تونیم بهش اضافه ، کم (معادل undo) و ... کنیم :

https://gist.github.com/sasssass/3440d35029522c0065f43ec7f9e72cec

و حالا کلاسِ ما آماده استفاده است :

https://gist.github.com/sasssass/5d4dae1afaa9216cd7ef7c4d58081611
نکته : یکی از بهترین ترکیب‌های الگوها ، ترکیب Memento و Command هست ، ما در Command عملیات‌هایی مثل undo و redo رو داریم که با Memento قابلیت پیاده‌سازی بهتری دارند

باقی مقالات در مورد الگوی‌های طراحی رو در این مقاله بخونید .

من رو در لینکدین و اینستاگرام دنبال کنید ???

اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???