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.
helal
YanıtlaSilTeşekkürler hocam
YanıtlaSil