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

Command design pattern (komut tasarım deseni) behavior grubununa ait, işlemlerin nesne haline getirilip başka bir nesne(invoker) üzerinden tetiklendiği bir tasarım desenidir. Command tasarım deseninin dofactory.com a göre kullanım sıklığı 80% civarındadır.







Bu pattern’e örnek olarak olarak dofactory.com’da hesap makinası örneği verilmiş bu pattern’i anlatan en güzel örneklerden biri bence. Hesap makinası düşünün 10+5-2*5 gibi bir çok komut gireriz ve ardından hesapla butonuna basar hesaplatırız. Burda da invoker aynı görevi görüyor bu programı yazsaydık invoker içerisine ICommand nesneleri gönderecek ve bunları bir listede tutacaktık. Ardından hesapla tusuna basıldığında ise bu commandları işlem sırasına göre çıkarıp işleyecektik.

Şimdi daha basit bir örnek yapalım: ICommand tipinde bir sınıfımız olsun. Bu interface’ten türeyen UndoCommand ve RedoCommand sınıflarımız olsun. Bunu şöyle düşünebilirsiniz Ctrl+Z ve Ctrl+Y yapan bir program yazdığımızı düşünelim, programda yaptığımız tüm Undo ve Redo commandları bir listede tutulup en son siz çalış dediğinizde çalışıyor. Mesela bilgisayarınızın takıldığında yaptığınız işlemleri sırayla yaptığını görmüşsünüzdür buda ona bir örnek. Şimdi bu programı yazalım:


UML Diagramı:
Kod:

    /// <summary>
    /// Command Interface
    /// </summary>
    public interface ICommand
    {
        void Execute();
    }

    /// <summary>
    /// Concrete Command Class
    /// </summary>
    public class UndoCommand : ICommand
    {
        public void Execute()
        {
            Console.WriteLine("Undo command worked.");
        }
    }

    /// <summary>
    /// Concrete Command Class
    /// </summary>
    public class RedoCommand:ICommand
    {
        public void Execute()
        {
            Console.WriteLine("Redo command worked.");
        }
    }

    public class Invoker
    {
        private Stack<ICommand> commandList = new Stack<ICommand>();

        public void ExecuteAll()
        {
            while (commandList.Count > 0)
                commandList.Pop().Execute();
        }

        public void AddCommand(ICommand c)
        {
            commandList.Push(c);
        }
    }

        static void Main(string[] args)
        {
            Invoker invoker = new Invoker();
            invoker.AddCommand(new UndoCommand());
            invoker.AddCommand(new UndoCommand());
            invoker.AddCommand(new RedoCommand());

            invoker.ExecuteAll();

            Console.ReadLine();

        }
Çıktı:




Bu örneğimiz LIFO’ya bir örnekte oldu. Stack yapımıza en son giren komutumuzu ilk çalıştıracak şekilde programımızı tasarlamış olduk.




2 yorum :