Command Pattern, bir işlevi nesneye dönüştürerek işlemleri parametreleştirmeye, kuyruklamaya, kaydetmeye ve geri alabilir hale getirmeye olanak tanır. Bu pattern, bir işlemi gerçekleştiren komut nesnesi ile işlemi başlatan nesneyi birbirinden ayırır.

Neden ve Nerede Kullanılır
- İşlemleri Nesneleştirme: İşlemleri nesnelere dönüştürerek, işlemler üzerinde esneklik sağlar.
- Undo (Geri Alma) ve Redo (Yineleme): İşlemlerin geri alınabilir veya yinelemeye yönelik yapılan oluşturulmasını sağlar.
- Karmaşık İş Akışları: Komutlar ile karmaşık iş akışları ve makro komutlar oluşturulabilir.
- Kapsülleme: İstemci ve alıcı arasında güçlü bir bağımlılık olmadan işlemleri kapsüller.
Örnek Kod
// Command Arayüzü
class Command {
execute() {
throw new Error("Execute method should be implemented");
}
undo() {
throw new Error("Undo method should be implemented");
}
}
// Receiver (Alıcı) Sınıfı
class Light {
turnOn() {
console.log("The light is on");
}
turnOff() {
console.log("The light is off");
}
}
// Concrete Command (Somut Komut) Sınıfları
class LightOnCommand extends Command {
constructor(light) {
super();
this.light = light;
}
execute() {
this.light.turnOn();
}
undo() {
this.light.turnOff();
}
}
class LightOffCommand extends Command {
constructor(light) {
super();
this.light = light;
}
execute() {
this.light.turnOff();
}
undo() {
this.light.turnOn();
}
}
// Invoker (Çağırıcı) Sınıfı
class RemoteControl {
setCommand(command) {
this.command = command;
}
pressButton() {
this.command.execute();
}
pressUndo() {
this.command.undo();
}
}
// Kullanım
const light = new Light();
const lightOnCommand = new LightOnCommand(light);
const lightOffCommand = new LightOffCommand(light);
const remoteControl = new RemoteControl();
remoteControl.setCommand(lightOnCommand);
remoteControl.pressButton(); // "The light is on"
remoteControl.pressUndo(); // "The light is off"
remoteControl.setCommand(lightOffCommand);
remoteControl.pressButton(); // "The light is off"
remoteControl.pressUndo(); // "The light is on"
Açıklama
- ‘Command’ sınıfı, komutların uyacağı ortak bir arayüz tanımlar. Bu sınıf genişletilerek ‘execute’ ve ‘undo’ yöntemlerini tanımlarız.
- ‘Light’ sınıfı, alıcı sınıftır ve ışığı açma ve kapatma işlemlerini gerçekleştirir.
- ‘LightOnCommand’ ve ‘LightOffCommand’ sınıfları, ‘Command’ sınıfı genişleterek somut komutları tanımlar. Her biri, ‘Light’ nesnesini kullanarak ışığı açma veya kapatma işlemlerini gerçekleştirir.
- ‘RemoteControl’ sınıfı, çağırıcı sınıftır ve komutları ayarlayarak, ‘execute’ ve ‘undo’ yöntemlerini çağırır.
- Kullanım kısmında, ‘Light’ nesnesi oluşturduk ve ‘LightOnCommand’ ve ‘LightOffCommand’ komutlarını tanımladık. ‘RemoteControl’ nesnesi ile bu komutları çalıştırdık ve geri aldık.
Özetle
Command Pattern, bir işlemi nesneye dönüştürerek işlemleri parametreleştirmeye, kuyruklamaya, kaydetmeye ve geri alabilir hale getirmeye olanak tanır. Bu pattern, işlemi gerçekleştiren nesne ile işlemi başlatan nesneyi birbirinden ayırır, böylece işlemler üzerinde daha fazla esneklik ve kontrol sağlar. Özellikle GUI uygulamaları, undo/redo işlevselliği ve karmaşıklık iş akışları gerektiren sislerde kullanışlıdır.