Komut(Command) Tasarım Deseni

10-05-2014
Nedir?

Komut(Command) tasarım deseni, behavioral tasarım desenlerinden biridir. Request-response model arasında lose coupling ilişki sağlar. Bir isteği nesneye dönüştürerek, isteğin kullanıcı sınıfları tarafından rahatça erişilebilmesi sağlanır.

Ne zaman Kullanılır?

Diyelim ki 4 tane buton var ve her bir buton farklı işlemler yapıyor. Hangi butona tıklandığını if-else ile kontrol edip ilgili işlemin çalıştırılması yerine veya her buton tıklama olayı için ayrı 4 farklı metod yazmak yerine komut tasarım deseni kullanarak, yapılacak işlemler için(örneğin Açma, Kapama, Kaydetme gibi) sınıflar oluştururuz. Daha sonra, bu butonların onclick event'ları içerisinde bu sınıflardan nesne yaratılıp execute() metodu çağırabiliriz. Bu sayede karmaşık if-else yapısından da kurtulmuş oluruz.

Nasıl Kullanılır?

Her komut için bir sınıf yaratılır. Bu sınıfların ortak türe sahip olabilmesi için Command isminde bir interface tanımlanır. Command interface içerisinde tek bir tane metod gereklidir: execute() . Her komut için oluşturulan sınıflar execute() metodunu implement ederler. execute() metodu asıl işlevi yapacak olan sınıfın metodunu çağırır. Asıl işlevi yapan sınıf Receiver sınıfıdır. Daha sonra Komut sınıflarının çağrılması için Invoker sınıfı oluşturulur. Fakat Invoker sınıfı hangi komut nesnesini kullanacağını bilmez. Sadece nasıl kullanacağını bilir. Son olarak Client ise Invoker sınıfını çağırır.

Faydaları Nedir?

1. Uygulama daha modüler ve esnek olur.
2. Geriye alma işlemi( undo ) ve anlık durumun restorasyonu gibi işlemler yapılabilir.
3. Loglama ve transactional işlemler için kullanılabilir.
4. Makro komutlar oluşturarak bu komutların bir anda çalıştırılması sağlanabilir.

Gerekenler

Türü interface olan Command sınıfı
Tek bir tane somut Command sınıfı
Receiver sınıfı
Invoker sınıfı
Test sınıfı

Örnek Kullanım Alanları

1. java.lang.Runnable interface'nin tüm implementasyonları
2. javax.swing.Action interface'nin tüm implementasyonları


Örnek Uygulama

Command interface

public interface Command {
    public void execute();
}

LightOnCommand Sınıfı
/**
* Somut Command sinifimiz
*/
public class LightOnCommand implements Command {
    Light light;
    
    public LightOnCommand(Light light) {
        this.light = light;
    }
    
    public void execute() {
        light.on();
    }
}

LightOffCommand Sınıfı
/**
* Somut Command sinifimiz
*/
public class LightOffCommand implements Command {
    Light light;
    
    public LightOffCommand(Light light) {
        this.light = light;
    }
    
    public void execute() {
        light.off();
    }
}

SimpleRemoteControl Sınıfı
/**
* Invoker sinifimiz
*/
public class SimpleRemoteControl {
    Command slot;
    
    public SimpleRemoteControl() {}
    
    public void setCommand(Command command) {
        slot = command;
    }
    
    public void buttonWasPressed() {
        slot.execute();
    }
}

Light Sınıfı
/**
* Receiver sınıfımız
*/
public class Light {
    
    public Light() {
    }
    
    public void on() {
        System.out.println('Light is on');
    }
    
    public void off() {
        System.out.println('Light is off');
    }
}

Test Sınıfı
/**
* Client sınıfımız
*/
public class RemoteControlTest {
    public static void main(String[] args) {
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        LightOnCommand lightOn = new LightOnCommand(light);
        remote.setCommand(lightOn);
        remote.buttonWasPressed();
        remote.buttonWasPressed();
    }
}

Uygulamamızın UML Diagramı



Komut Tasarım Deseni'nin Şematik Gösterimi

© 2019 Tüm Hakları Saklıdır. Codesenior.COM