Originator: Değerleri tutulacak olan ve önceki değerlerine geri dönebilen sınıftır.
Senaryo olarak bir metin editörü geliştirdiğimizi ve bu metin editöründe önceki yazdıklarımıza ve o anki cursor pozisyonuna geri dönebildiğimizi düşünelim.
C# Kod Örneği:
// Saklamak istediğimiz değerlerin tanımlandığı yerdir.// UML diyagramındaki Memento yapısına denk gelir.classTextMemento{publicstring Text { get; set; }publicint CursorPosition { get; set; }}
// Memento'ların referansının tutulduğu yerdir.// UML diyagramındaki CareTaker yapısına denk gelmektedir.classTextUndoCareTaker{privateStack<TextMemento> _mementos;publicTextUndoCareTaker() { _mementos =newStack<TextMemento>(); } // Çağrılma işlemi yapıldığında yığının en üstündeki Memento örneği silinir ve geriye döndürülür. // Ekleme işlemi yapıldığında yığının en üstüne Memento örneği eklenir. // Klasik Stack.publicTextMemento TextMemento {get {return_mementos.Pop(); }set {_mementos.Push(value); } }}
// Değerleri tutulacak olan ve önceki değerlerine geri dönebilen sınıftır.// UML diyagramındaki Originator yapısına denk gelmektedir.// Geriye dönebilme özelliği olduğundan önceki durumları tutan CareTaker referansını tutmaktadır.classTextOriginator{publicstring Text { get; set; }publicint CursorPosition { get; set; }privateTextUndoCareTaker _textCareTaker;publicTextOriginator() { _textCareTaker =newTextUndoCareTaker(); } // Anlık kayıt değerlerini UML diyagramındaki CareTaker üzerinden yığına eklemektedir.publicvoidSave() {_textCareTaker.TextMemento=newTextMemento { CursorPosition =this.CursorPosition, Text =this.Text }; } // Geri alma işleminde yığının en üstündeki değeri alır. // Değer alma işleminden sonra sınıfın mevcut değerlerine atanır.publicvoidUndo() {TextMemento previousTextMemento =_textCareTaker.TextMemento; CursorPosition =previousTextMemento.CursorPosition; Text =previousTextMemento.Text; }publicoverridestringToString() {return$"text: {Text}, cursor position: {CursorPosition}"; }}
TextOriginator textOriginator =newTextOriginator();textOriginator.Text="asm";textOriginator.CursorPosition=3;// Anlık durum yığına ekleniyor.textOriginator.Save();textOriginator.Text="asmi";textOriginator.CursorPosition=4;// Anlık durum yığına ekleniyor.textOriginator.Save();textOriginator.Text="asmin";textOriginator.CursorPosition=5;// Anlık durum yığına ekleniyor.textOriginator.Save();// Yığındaki bir önceki duruma geçiyor.textOriginator.Undo();Console.WriteLine(textOriginator.ToString());// Yığındaki bir önceki duruma geçiyor.textOriginator.Undo();Console.WriteLine(textOriginator.ToString());// Yığındaki bir önceki duruma geçiyor.textOriginator.Undo();Console.WriteLine(textOriginator.ToString());//output:// text: asmin, cursor position: 5// text: asmi, cursor position: 4// text: asm, cursor position: 3