تا حالا شما بگید "عه ، این چه کاری بود کردم" و آرزو میکردید زمان برمیگشت تا بتونید وضعیت اون موقعتون رو داشته باشید ؟ خلاصه بگم Memento دقیقا همین کار رو میکنه ! Memento در لغت به معنی یادآوری میشه ، ما هم در این الگو به گذشته و حالتهایِ (State) قبلیِ شئ برمیگردیم . فایده استفاده از این الگو در عملیاتی مثل undo یا تهیه Log ای از سوابق اعمال بر روی شئ یا ... هست .
در این الگو چند بخش داریم :
شئای هست که قصد داریم Memento رو روش اعمال کنیم و بعدا بتونیم بازیابیش کنیم
کلاسی که شامل اطلاعاتِ مورد نظره که قراره بازیابی بشه
کلاسی که فرمان به عملیاتِ بازیابی میده
شِمایِ کلی قضیه به صورتِ زیره :
طبقِ این UML ما این طور عمل میکنیم که کلاسِ Caretaker شئ Memento رو در اختیار خودش داره و Memento و Originator با هم این سابقه رو تهیه میکنند .
در کلیپ بورد گوشی متون مختلفی وجود دارند ، با Memento کدی مینویسیم که بتواند به همهی این متون دسترسی پیدا کنه و بتونه آخرین متن رو حذف کنه (مثلا معادل undo)
اول از همه Originator ، Originator در اینجا کلاسی به اسم ClipBoard میشه که در هر لحظه فقط یک متن رو در خودش داره ، کلاس Memento ما باید مقادیر مورد نیاز از ClipBoard رو داشته باشه که اینجا فقط یه String هست ، فرض میکنیم در ClipBoard متغیر دیگهای جز String هم هست به اسم dataSize که طولِ اون رشته رو نگه میداره ، این متغیر رو لزومی نداره در Memento بیاریم چون با دسترسی به String میتونیم بعدا بدستش بیاریم (پس لازم نیست حافظه بیخودی بهش اختصاص بدیم) ، تابعی به نام copy در ClipBoard ایجاد میکنیم که وظیفهاش مقدار دهی String هست :
حالا نوبت به Caretaker میرسه که وظیفهاش انجام عملیاتِ گرفتن دیتاهاست ، در این کلاسِ لیستی از Memento رو داریم که میتونیم بهش اضافه ، کم (معادل undo) و ... کنیم :
و حالا کلاسِ ما آماده استفاده است :
نکته : یکی از بهترین ترکیبهای الگوها ، ترکیب Memento و Command هست ، ما در Command عملیاتهایی مثل undo و redo رو داریم که با Memento قابلیت پیادهسازی بهتری دارند
باقی مقالات در مورد الگویهای طراحی رو در این مقاله بخونید .
من رو در لینکدین و اینستاگرام دنبال کنید ???
اگه دوست داشتید میتونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???