C# Memento Pattern Kullanımı - OOP Design Pattern

Memento tasarım kalıbındaki esas amaç bir nesnenin önceki halinin veya hallerinin saklanması ve istenildiğinde tekrardan elde edilebilmesidir.

En basit örnekle nesneye Ctrl-Z, Ctrl-Y yapabildiğinizi düşünün. Nesne üzerinde yaptığınız değişiklikleri geri alıp ilk haline dönebilmenizi sağlar. Dofactory.com'a göre çok az kullanılan bir tasarım desenidir. Bu deseni nesnelere, dahili durumları için geri alma işlemi(Undo) yeteneğininin kazandırılması olarak da düşünebiliriz.




Şimdi örneğimize geçelim: Bir user sınıfı tasarlayalım bu user sınıfı bizim Originator sınıfımız olacak.

Originator  Class: Bu sınıf üzerinde user ile ilgili alanlar tutuluyor. Bunlara ek olarakta nesneyi Backup ve Restore etmemize yarayan metodlar bu sınıfa yazılıyor.



    /// <summary>
    /// Originator Class
    /// </summary>
    public class User
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public string IDNo { get; set; }

        public UserMemento Backup()
        {
            return new UserMemento
            {
                UserId = this.UserId,
                Name = this.Name,
                IDNo = this.IDNo
            };
        }

        public void Restore(UserMemento memento)
        {
            this.UserId = memento.UserId;
            this.Name = memento.Name;
            this.IDNo = memento.IDNo;
        }

        public override string ToString()
        {
            return String.Format("User ID: {0} Name: {1} ID NO: {2}\n", UserId, Name, IDNo);
        }
    }


Memento Class: Bu sınıf user nesnesinin alanlarının aynısını tutuyor.



    /// <summary>
    /// Memento Class
    /// </summary>
    public class UserMemento
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public string IDNo { get; set; }
    }


Caretaker Class: Bu sınıf memento nesnesini ya da geri dönüş n adım geriye olacaksa memento nesnelerini tutacak. Bizim örneğimiz sadece tek adım geriye gidilecek şekilde tasarlandığı için sadece bir memento nesnesi tutuyor.



    /// <summary>
    /// Caretaker Class
    /// </summary>
    public class Memory
    {
        public UserMemento Memento { get; set; }
    }


Artık client tarafına geçebiliriz.



    class Program
    {
        static void Main(string[] args)
        {
            Memory memory = new Memory();
            User user = new User { UserId = 123123, Name = "Ahmet", IDNo = "1232134353" };

            //User nesnesinin ilk hali yazdırılıyor
            Console.WriteLine(user.ToString());

            //Memento nesnesine backup alınıyor
            memory.Memento = user.Backup();

            //User nesnesi üzerinde değişiklikler yapılıyor
            user.Name = "Mehmet";
            user.IDNo = "2423552342";

            //Değişiklikler sonrası user nesnesi yazdırılıyor
            Console.WriteLine(user.ToString());

            //User nesnesi memento üzerinden restore ediliyor
            user.Restore(memory.Memento);

            //Restore sonrası user nesnesi
            Console.WriteLine(user.ToString());

            Console.ReadLine();


        }
    }


Çıktı:


Gördüğünüz gibi ismi Ahmet olan user'ın ismi Mehmet'e çevriliyor fakat ardından Restore işlemi gerçekleştirilince yeniden tüm bilgileri ilk haline geri dönüyor.

0 yorum :

Yorum Gönder