Memento Design Pattern

Memento Design Pattern

Kendisi Behavioral tasarım kalıpları gurubunda olan bir tasarım desenidir. Memento tasarım kalıbını hangi durumlarda kullanabiliriz sorusuyla başlayabiliriz. Memento tasarım kalıbı ile varlıkların initial stateleri yani o anki mevcut konumları saklanarak herhangi bir zaman dilimi içerisinde bir önceki hallerine döndürülmek istenen durumlarda kullanılır.

MementoDiagramOriginator: Bu sınıf durumu tutulacak olan nesnemiz oluyor, eski veya yeni halini tutmamızı sağlayacak metotlar burada yer alacak.
Memento: Bu sınıf ise, asıl nesnemizin istediğimiz alanları tutan sınıftır.
Caretaker: Geri dönüş adımlarımızı Memento tipinden tutacak olan sınıftır.

Aşağıdaki senaryomuz bir oyun üzerinden ilerlesin. Oyunda bulunan Gezegenler oyunun belirli zamanlarında kaydedilen eski haline çevrilebilsin. 

  • GameWorld (Orginator class): Saklamak istediğimiz gerçek nesnemizin sınıfı
    class GameWorld
    {
         public string Name { get; set; }
         public long Population { get; set; }

        //Yeni bir gameworldmomento nesnesi örnekleyip ona orginator classına ait nesnenin ilgili özelliklerini atar.
         public GameWorldMemento Save()
         {
            return new GameWorldMemento { Name = this.Name, Population = this.Population }; //calisma zamanındaki özelllikleri alır.
         }

         //o anda gelen orginator nesnesinin ilgili özelliklerini set eder
          public void Undo(GameWorldMemento memento)
          {
            this.Name = memento.Name;
            this.Population = memento.Population;
          }
      
          public override string ToString()
          {
            return String.Format("{0} dünyasında {1} insan var", Name, Population);
          }
      }
  • GameWorldMemento (Memento class): T anında save etmek istediğimiz nesnenin saklanacağı class ; hangi özellikleri saklamak istersek onlara uygun propertyler tanımlamamaız yeterli olacaktır.
      class GameWorldMemento
      {
          public string Name { get; set; }
          public long Population { get; set; }
      }
  • GameWorldCareTaker (Caretaker class): Memento classı güvenli bir şekilde saklar ama üyeleri üzerinde herhangi bir değişiklik yapmaz.
      class GameWorldCareTaker
      {
          public GameWorldMemento World { get; set; } //mementoyu döner.
      }
      class Program
      {

         static void Main(string[] args)
         {
              GameWorld zulu = new GameWorld { Name = "Zulu", Population = 100000 };

              Console.WriteLine(zulu.ToString());

              GameWorldCareTaker taker = new GameWorldCareTaker();
              taker.World = zulu.Save(); //zulunun o anki halini sakla

              zulu.Population += 10;
              Console.WriteLine(zulu.ToString());

              zulu.Undo(taker.World); //eski dünyayi geri yükle

              Console.WriteLine(zulu.ToString());
   
          Console.ReadKey();
        }

     }