C# Memento Design Pattern(Memento Tasarım Deseni)

Merhaba,

Behavioral Patterns(Davranışsal Kalıplar) kategorisinde bulunan Memento Design Pattern üzerine içerik oluşturacağız.

Memento adı üzerinde “hatıra”, “yadigar” vs.. demektir 🙂 Yani anlayacağınız hatırlayıcı işlevde bir tasarım deseni üzerine konuşuyor olacağız. Memento Design Pattern, elimizdeki mevcut nesnenin herhangi bir T anındaki durumunu kayda alarak, sonradan oluşabilecek değişiklikler üzerine tekrardan o kaydı elde etmemizi sağlayan bir desendir. Burada mevcut nesnenin özel bir halinden bahsetmemiz mümkündür. O hal ilgili tasarım kalıbı sayesinde sonradan da elde edilebilecektir.

Aşağıdaki UML Diyagramını incelersek eğer;
C# Memento Design Pattern(Memento Tasarım Deseni)
Originator, CareTaker ve Memento kavramlarını göreceğiz. Şimdi diyagram eşliğinde bu aktörleri açıklayalım.

  • Originator
    Yaratıcı, mucit, üretken olarak ifade edebileceğimiz bu nesne kopyası saklanacak olan nesneyi ifade etmektedir. Bu nesne, kendi kopyasının oluşturulmasından sorumlu olduğu gibi geri yüklenmesinden de sorumludur.
  • Memento
    Kopyalanacak nesnenin hangi özelliklerinin tutulacağı, bir başka deyişle hangi değerlerinin işleneceğini belirttiğimiz nesnedir.
  • CareTaker
    Bakıcı olarak nitelendirilen bu nesne, Memento referansını barındırmakta ve yapılacak tüm işlemlerin organizasyonunu sağlamaktadır.

Şimdi Memento Design Pattern’i örneklendireceğimiz uygulamamıza geçelim. Örneğimizde bir oyunu senaryolaştıracağız. Oyunumuz ‘güya’ SekSek isminde bir oyun olacak ve Level, BolumAdi vs. gibi bilgileri tutacaktır. Oyun oynandıkça ilgili bilgiler değişecek, haliyle bizde Memento D. P. uygulayarak değişim sürecindeki herhangi bir T anındaki nesneyi kopyalayarak geri getireceğiz.

Öncelikle kopyası alınacak Originator nesnemizi oluşturalım.

    class Seksek
    {
        public int Level { get; set; }
        public string BolumAdi { get; set; }

        public override string ToString()
        {
            return $"{Level}. levelın {BolumAdi} bölümündeyiz.";
        }
    }

Birazdan bu sınıf üzerinde güncelleme yaparak yeni metodlar ekleyeceğiz. Şimdilik ekleyeceğimiz yeni elemanlarda kullanacağımız Memento ve CareTaker nesnelerini oluşturalım.

Memento sınıfımızı oluşturalım.

    class SekSekMemento
    {
        public int Level { get; set; }
        public string BolumAdi { get; set; }
    }

Kopyalanacak olan SekSek nesnemizin mevcut olan tüm özelliklerini tutacağımızı belirtmiş olduk. n adet alanın ister hepsini, istersenizde bir kısmını Memento nesnesinde belirterek o anki nesnenin bilgilerini tutabilirsiniz.

Şimdide CareTaker nesnemizi oluşturalım.

    class SekSekCareTaker
    {
        public SekSekMemento Memento { get; set; }
    }

Bu noktadan sonra asıl SekSek sınıfımıza Memento tasarımını uygulattıracak rollerin metodlarını ekleyelim.

    class Seksek
    {
        public int Level { get; set; }
        public string BolumAdi { get; set; }

        public override string ToString()
        {
            return $"{Level}. levelın {BolumAdi} bölümündeyiz.";
        }

        //T anında nesneyi tutacak olan metod.
        public SekSekMemento Kaydet()
        {
            return new SekSekMemento
            {
                BolumAdi = this.BolumAdi,
                Level = this.Level
            };
        }

        //T anındaki nesneye bizi ulaşturacak olan metod.
        public void OncekiniYukle(SekSekMemento Memento)
        {
            this.BolumAdi = Memento.BolumAdi;
            this.Level = Memento.Level;
        }
    }

Gördüğünüz gibi, geriye SekSekMemento dönen Kaydet metodu ile T anındaki nesnemizi yakalıyoruz. Tabi bunu CareTaker nesnesinde Client tarafında tutacağız. Aynı CareTaker nesnesinde tutuyor olacağımız Memento nesnesini OncekiniYukle metodu sayesinde ilgili nesneye entegre ederek, T anındaki nesneye(daha doğrusu T anındaki bilgilere sahip nesneye) erişmiş olacağız.

Ayrıyetten dikkat ederseniz Originator sınıfından Memento sınıfına karşı bir bağımlılık(Dependency) söz konusudur.

Şimdi yaptığımız işlemleri test edelim.

    class Program
    {
        static void Main(string[] args)
        {
            Seksek oyun = new Seksek();
            oyun.Level = 1;
            oyun.BolumAdi = "Mağara";
            Console.WriteLine(oyun.ToString());

            SekSekCareTaker Taker = new SekSekCareTaker();
            //T anında ilgili SekSek nesnesini kopyalıyoruz ve
            //CareTaker nesnesi içerisindeki Memento'ya bağlıyoruz.
            Taker.Memento = oyun.Kaydet();

            oyun.Level = 2;
            oyun.BolumAdi = "Karayip Adaları";
            Console.WriteLine(oyun.ToString());

            //T anında kopyaladığımız nesneye CareTaker üzerinden erişiyor
            //ve ilgili Originator nesnemize load ediyoruz.
            oyun.OncekiniYukle(Taker.Memento);

            Console.WriteLine(oyun.ToString());

            Console.Read();
        }
    }

Yukarıdaki test sonucunda aşağıdaki ekran görüntüsünü elde etmekteyiz.
C# Memento Design Pattern(Memento Tasarım Deseni)

Okuduğunuz için teşekkür ederim…

Sonraki yazılarımda görüşmek üzere…

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.