Command Pattern Nedir? Nasıl Kullanılır?

Command Pattern (Komut Tasarım Deseni), bir isteği nesne olarak temsil etmemize olanak tanır. Bu sayede isteği, parametre olarak iletebilir, kuyruğa alabilir veya kaydedip daha sonra gerçekleştirebiliriz. Genellikle undo (geri alma) işlemlerinin desteklenmesi gereken durumlarda kullanılır.

Komut deseni, davranışsal tasarım desenleri arasında yer alır ve temel olarak dört bileşenden oluşur. Kısaca söyleyecek olursak bu bileşenler; Komut, Alıcı (Receiver), Çağırıcı (Invoker) ve İstemci (Client)‘dır.

Command Pattern Nasıl Kullanılıyor? Kod Örnekleri

1. Komut (Command) Arayüzü

Komut arayüzü, tüm komutların implement etmesi gereken bir arayüzdür. Genellikle tek bir execute() metodu içerir.

public interface Command {
    void execute();
}

2. Alıcı (Receiver) Sınıfı

Alıcı sınıfı, komutların üzerinde çalıştığı gerçek işlemleri gerçekleştiren sınıftır. Bu sınıf, komutlar tarafından tetiklenen işlevselliği içerir.

public class Light {
    public void turnOn() {
        System.out.println("Işık açıldı.");
    }

    public void turnOff() {
        System.out.println("Işık kapatıldı.");
    }
}

3. Komut Sınıfları

Her komut, Command arayüzünü implement eden bir sınıf olarak tanımlanır. Bu sınıflar, alıcıya hangi işlemin yapılacağını bildirir.

public class TurnOnLightCommand implements Command {
    private Light light;

    public TurnOnLightCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }
}

public class TurnOffLightCommand implements Command {
    private Light light;

    public TurnOffLightCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }
}

4. Çağırıcı (Invoker) Sınıfı

Çağırıcı sınıfı, komutu çağıran yani komutu gerçekleştiren nesnedir. İstediğimiz zaman belirli bir komutu çalıştırabiliriz.

public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

5. İstemci (Client) Kodu

İstemci, tüm bu bileşenleri birbirine bağlar. Hangi komutun hangi alıcıya uygulanacağını belirler.

public class Main {
    public static void main(String[] args) {
        Light livingRoomLight = new Light();

        Command turnOn = new TurnOnLightCommand(livingRoomLight);
        Command turnOff = new TurnOffLightCommand(livingRoomLight);

        RemoteControl remote = new RemoteControl();

        remote.setCommand(turnOn);
        remote.pressButton();

        remote.setCommand(turnOff);
        remote.pressButton();
    }
}

Command Pattern Avantaj ve Dezavantajları

Komut Deseninin Avantajları

Geri Alma Desteği

Komutlar, geri alma işlemleri için kaydedilebilir.

Ayrık Sorumluluklar

Komut sınıfları, farklı işlemleri birbirinden ayırarak kodun daha modüler olmasını sağlar.

Esneklik

İstemcinin hangi komutu ne zaman çağıracağını esnek bir şekilde yönetmesine olanak tanır.

Dezavantajları

Komplekslik

Özellikle büyük projelerde her işlem için ayrı bir komut sınıfı tanımlamak, çok sayıda sınıfa neden olacaktır.

Yönetim Zorluğu

Özellikle büyük projelerde komutları yönetmek karmaşıklaşabilir.

Sonuç

Command Design Pattern, özellikle karmaşık işlemleri soyutlamak ve bu işlemler üzerinde daha fazla kontrol sağlamak için idealdir. Undo (geri alma) desteği gibi durumlar, bu desenin en büyük artılarından biridir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir