মেমেন্টো ডিজাইন প্যাটার্ন


মেমেন্টো ডিজাইন প্যাটার্ন লিখার আগে মেমেন্টো মুভিটার কথা না বললেই নয়। কিংবদন্তী পরিচালক ক্রীস্টোফার নোলান তার মেমেন্টো মুভিতে হিরো হিসেবে এমন একটি ক্যারেকটার দেখান যে অ্যামনেশিয়াতে আক্রান্ত । হিরো তার লাইফের ইভেন্টগুলো ব্যাক ট্রেস করে খুনিকে ধরার চেষ্ঠা করে।

memento

(ছবিটি অনলাইন থেকে মেরে দেয়া :P)

তো মেমেন্টো মুভি আর মেমেন্টো ডিজাইন প্যাটার্ন অনেকটা একই রকম ।

মেমেন্টো ডিজাই প্যাটার্নঃ মেমেন্টো ডিজাইন প্যাটার্ন হচ্ছে এমন একটি এপ্রোচ যেটা দিয়ে অবজেক্ট এর ইন্টার্নাল স্টেট একটি এক্সটার্নাল জায়গায় সেভ করা যায় এবং সময়মত দরকার হলে সেটা রিস্টোর করা যায়

এখন প্রশ্ন আসতে পারে , অবজেক্ট এর ইন্টার্নাল স্টেট যদি এক্সটার্নাল একটি জায়গায় রেখে দিই তাহলে এটি অবজেক্ট ওরিয়েন্টেড ডিজাইন প্রিন্সিপাল এর এনক্যাপশুলেশন কে ভায়োলেট করবে কিনা ? উত্তর হচ্ছে “না”

গফের সংজ্ঞা আনুযায়ী “Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later.

এখন আমরা দেখে নেবো, কিভাবে মেমেন্টো ডিজাইন প্যাটার্ন কোডে অ্যাপ্লাই করতে পারি।এর আগে জেনে নেয়া ভালো যে,মেমেন্টো ডিজাইন প্যাটার্ন তিনটি অবজেক্ট নিয়ে কাজ করে এগুলো হচ্ছেঃ

  1. Originator: মুল অবজেক্ট যার স্টেট সেভ করতে হবে এবং রীস্টোর করতে হবে ।
  2. Memento: Memento কে Originator ইউজ করে Originator এর স্টেট সেভ করে রাখে।
  3. Caretaker: Memento এর রিপোজিটোরি হিসেবে কাজ করে(Create,Update,Delete) কিন্তু Memento এর কন্টেন্ট উপর সরাসরি কখনই কাজ করে না।

আমরা প্রথমে মেমেন্টো ক্লাস বানাবো এভাবেঃ

   public class Memento
    {
        public Memento(string state)
        {
            State = state;
        }

        public string State { get; private set; }
    }

উদাহরণের সুবিধার জন্যে class এ আমরা শুধুমাত্র একটি প্রোপার্টি “state” রেখেছি।
এখন Memento এর রিপোজিটরী CareTaker class বানিয়ে ফেলি এভাবেঃ

    public class Caretaker
    {
        private readonly List<Memento> _savedStateList = new List<Memento>();
 
        public void AddMemento(Memento memento)
        {
            _savedStateList.Add(memento);
        }
 
        public Memento GetMemento(int index)
        {
            return _savedStateList[index];
        }
    }

উদাহরণের সুবিধা/সিমপ্লিসিটির জন্যে আমরা এখানে Memento এর একটি লিস্ট নিয়েছি এবং এই লিস্টে Memento Add, এবং Get করার ফাংশনালিটি দেয়া হয়েছে ।

এখন চলুন আমরা মেমেন্টো ডিজাইন প্যাটার্নের মূল অবজেক্ট “Originator” বানিয়ে ফেলি । এই অবজেক্ট এর ষ্টেট গুলোই মুলত আমাদের সেভ এবং রিস্টোর করতে হবে।

 
  public class Originator
   {
       private string _state;
       public string State
       {
           private get
           {
               return _state;
 
           }
           set
           {
               _state = value;
               Console.WriteLine("Originator: Setting state to " + _state);
           }
       }
       public Memento SaveToMemento()
       {
           Console.WriteLine("Originator: Saving to Memento.");
           return (new Memento(_state));
       }
       public void RestoreFromMemento(Memento memento)
       {
           State = memento.State;
           Console.WriteLine("Originator: State after restoring from Memento: " + State);
 
       }
   }

এখানে আমরা তিনটি কাজ করেছি

  1. অবজেক্ট এর ষ্টেট সেট করার সময় ষ্টেট এর নাম প্রিন্ট করেছি
  2. অবজেক্ট এর ষ্টেট Memento এ সেভ করে ঐ Memento রিটার্ন করেছি।
  3. অবজেক্ট এর ষ্টেট Memento থেকে রিস্টোর করেছি ।

এখন দেখা যাক আমরা আমাদের ক্লায়েন্ট কোড এ মেমেন্টো ডিজাইন প্যাটার্ন কিভাবে ইউজ করিঃ

public class Program
{
     public static void Main(string[] args)
     {
          Caretaker careTaker = new Caretaker();
          Originator originator = new Originator();
            
          originator.State = "State1";
          careTaker.AddMemento(originator.SaveToMemento());
            
          originator.State = "State2";
          careTaker.AddMemento(originator.SaveToMemento());
 
          originator.State = "State3";
          careTaker.AddMemento(originator.SaveToMemento());
            
            
          originator.State = "State4";
          careTaker.AddMemento(originator.SaveToMemento());
 
          originator.RestoreFromMemento(careTaker.GetMemento(2));
            
          Console.ReadLine();
        }
    }

এখানে আমরা CareTaker এবং Originator আমরা এর অবজেক্ট বানিয়েছি ।
এরপর Originator এর ষ্টেট এসাইন করেছি, Caretaker কে দায়িত্ব দিয়েছি Originator এর সবগুলো ষ্টেট সেভ করে রাখতে এবং সবশেষে Originator থেকে (কোডে তিন নাম্বার) ষ্টেট রিস্টোর করেছি । সো এই ছিলো আমাদের Memento ডিজাইন প্যাটার্ন 🙂
হ্যাপি কোডিং 🙂

Leave a comment