Memento Design Pattern
Kendisi Behavioral tasarım kalıpları grubunda 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.
Originator: 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(); } }