Command tasarım deseni, kullanıcı isteklerini gerçekleştiren kod yapısını sarmallayarak nesneler halinde saklanmasını daha sonra da bu isteklerin gerçekleştirilmesini veya geri alınmasını sağlayan tasarım desenidir.
Nesne üzerinde bir işleminin nasıl yapıldığını bilmediğimiz ya da kullanılmak istenen nesneyi tanımadığımız durumlarda kullanılır.
Bu tasarım desenine ait UML diyagramı aşağıdaki gibidir.
Command: Temel arayüzdür, komutların çalıştırılması için temel metotu içermektedir.
ConcreteCommand: Nesnelere dönüştürdüğümüz her bir isteğe denk gelmektedir, Command arayüzünü uygular.
Invoker:Command referansını tutan, metotun ne zaman çağrılacağını belirtir.
Receiver:Client tarafının asıl iletişime geçeceği sınıftır.
Senaryo olarak bir ürüne ait stok takibi verilen basit bir sistem olduğunu var sayalım. Burada stok ile ilgili işlemler bu tasarım desenine göre yapılsın.
// Temel arayüzdür.// Komutların çalıştırılması için temel metotu içermektedir.// UML diyagramındaki Command arayüzüne denk gelmektedir.interfaceIOrderCommand{voidExecute();}
// Nesnelere dönüştürdüğümüz her bir isteğe denk gelmektedir.// Command (IOrderCommand) arayüzünü uygular.// UML diyagramındaki ConcreteCommand sınıfına denk gelmektedir.classBuyStock:IOrderCommand{privateStockManager _stockManager;publicBuyStock(StockManager stockManager) { _stockManager = stockManager; }publicvoidExecute() {_stockManager.Buy(); }}
// Nesnelere dönüştürdüğümüz her bir isteğe denk gelmektedir.// Command (IOrderCommand) arayüzünü uygular.// UML diyagramındaki ConcreteCommand sınıfına denk gelmektedir.classSellStock:IOrderCommand{privateStockManager _stockManager;publicSellStock(StockManager stockManager) { _stockManager = stockManager; }publicvoidExecute() {_stockManager.Sell(); }}
// Command (IOrderCommand) arayüzünü uygulayan sınıf referansını tutar.// Metotun ne zaman çağrılacağını belirtir.// UML diyagramındaki Invoker sınıfına denk gelmektedir.classStockController{privateList<IOrderCommand> _orderCommands;publicStockController() { _orderCommands =newList<IOrderCommand>(); }publicvoidTakeOrder(IOrderCommand command) {_orderCommands.Add(command); }publicvoidPlaceOrders() {foreach (IOrderCommand command in _orderCommands) {command.Execute(); }_orderCommands.Clear(); }}