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.
İçerik
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.