Memento Design Pattern

Selamlar;

Bugün benim de çokça kullandığım davranışsal yani behavioral tasarım kalıplarından memento üzerine konuşacağız. Amacı özellikle oyunlarda,  yazı editör uygulamalarında yada adım adım işlem yapılan uygulamalarda en son yapılan işi geri almaktır. Bugünkü ugulamamızda biz ileri ve geri alma işlemlerini yani undo ve redo’yu birlikte kullanacağız. Mesela ben en son yazdığım puzzle oyununda bu yapıyı kullandım. Bu kalıp 3 yapıdan oluşur. Durumu korunmak istenen objenin tamamının yada bir kısmının başka bir yerde kopyasını saklayan(Memento).  Tamamının veya bazı özelliklerinin kopyasının tutulacağı gerçek nesne aynı zamanda memento nesnesini oluşturan ve geri yüklenmesinden sorumlu kısım (Originator). Saklanacak olan memento nesnesinin referans değerlerini saklayan (Caretaker) dır.

Memento

Image Source: http://sourcemaking.com/files/sm/images/patterns/Mediator__1.gif

Örnek olarak bir Console Application yazacağız. Aşağıda görüldüğü gibi bir twitter uygulamamız var. Konu ve harf sayısı alanları bulunmaktadır.

Bu tweet’de harf sayısı arttığı zaman önceki durumu aşağıdaki nesnede saklanır. Görüldüğü gibi değişimden önceki son durum Stack nesnesinde saklanmaktadır.

Son durum saklanırken bu son hali(TwitterWordMemento), TwitterWordTaker nesnesine Push() edilir.

Var olan durumdan bir önceki duruma dönmek için aşağıda görüldüğü gibi Undo() methodu kullanılır. Bu sırada önceki kayıtlar çekilmeden önce TwitterWordTakerRedo nesnesine  o anki değerler atanır. Böylece istendiğinde ileri doğru(redo) bir hareket yapldığında güncel datalar çekilip atanabilmektedir. TwitterWordTaker nesnesinden çekilen bir önceki duruma ait datalar geçerli güncel duruma ait olan Topic ve LetterCount propertyleri yerine atanır.

Var olan durumdan bir sonraki duruma geçmek için aşağıda görüldüğü gibi Redo() methodu kullanılır. Bu sefer var olan güncel durum TwitterWordTaker nesnesine atanır. Amaç ileride Undo() yani geri alma işlemi yapılmak istendiğinde ilgili bir önceki dataya dönebilmektir. TwitterWordTakerRedo nesnesinden bir sonraki data çekilerek güncel Topic ve LetterCount değerleri yerine atanır. Böylece bir sonraki dataya geçilmiş olunur.

Yukarıda bahsedilen Undo() ve Redo() methodları aşağıda görüldüğü gibi kullanılmıştır. MementoDesignPattern tweetinde ilk baştaki harf sayısı 50 dir. Daha sonra bu değer 60 ve daha sonrada 110 olarak artmıştır. Her Save() methodunda TwitterWordTaker’a data güncellenmeden önceki değerleri Push() edilmiştir. Böylece geriye dönük hareket edildiğinde yani Undo() methodunda bir önceki datalar çekilip atanabilmektedir. Daha sonra Undo işlemleri yapılmakta ve her Undo() işleminden sonra bir önceki kayıt çekilip yazdırılmaktadır. İlerleyen adımlarda Redo işlemleri yapılmakta ve her Redo() işleminde bir sonraki kayıt çekilerek güncel data olarak atanıp yazdırılmaktadır.

Örnek Ekran Çıktısı:

memento

Tüm Kodlar:

Yukarıda görüldüğü gibi  design patternlar işimizi çok kolaylaştırmaktadır. Dünyayı birdaha keşfetmeye gerek yoktur. Özellikle adım adım işleyen yapılarda memento design pattern çok kullanışlıdır. Güncel hayatımız da nerde ise heryerde kullandığımız undo() ve redo() işlemleri için  bu design pattern’ın önemi kaçınılmazdır.

Bir sonraki makalede görüşmek üzere hoşçakalın.

Source: https://www.dofactory.com/net/memento-design-pattern, https://en.wikipedia.org/wiki/Memento_pattern

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Omer dedi ki:

    Elinize saglik.
    Cok guzel olmus hocam. Zevkle okudum. Design pattern ayni satranc gibi.

    Iyi hafta sonlari..

  2. Muhammed Akabş dedi ki:

    Ne yaptığını bilmek insana değer katıyor. elinize sağlık

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.