Command Pattern (Komut Tasarım Deseni), bir isteği (komutu) nesne olarak paketlemenizi sağlar. Yani, bir işlemi gerçekleştirmek isteyen kod ile bu işlemi uygulayan kodu birbirinden ayırır.
Bu desenle; işlemleri sıraya alabilir, geri alabilir (undo), kaydedebilir ya da farklı zamanlarda çalıştırmak üzere bekletebilirsiniz.
“Ne yapılacağını bir nesneye dönüştür” felsefesiyle çalışır.
Ne İçin Kullanılır?
-
Komutları sıraya koymak
-
Geri alınabilir (undo/redo) sistemler yapmak
-
İstekleri loglamak ya da daha sonra çalıştırmak
-
Arayüz veya buton işlemlerini soyutlamak
-
Görevleri (task/job) planlamak
Gerçek Hayatta Nerede Kullanılır?
-
Undo/Redo sistemleri (örneğin Photoshop, Word)
-
Queue sistemleri (örn. Laravel Job/Queue)
-
Makro komutlar (birden fazla işlemi zincirlemek)
-
Uzaktan kumanda uygulamaları
-
Menü ya da buton tıklamaları
<?php
interface Command {
public function execute();
}
<?php
class Editor {
public function copy() {
echo "Metin kopyalandı.\n";
}
public function paste() {
echo "Metin yapıştırıldı.\n";
}
public function undo() {
echo "Son işlem geri alındı.\n";
}
}
<?php
class CopyCommand implements Command {
private $editor;
public function __construct(Editor $editor) {
$this->editor = $editor;
}
public function execute() {
$this->editor->copy();
}
}
class PasteCommand implements Command {
private $editor;
public function __construct(Editor $editor) {
$this->editor = $editor;
}
public function execute() {
$this->editor->paste();
}
}
class UndoCommand implements Command {
private $editor;
public function __construct(Editor $editor) {
$this->editor = $editor;
}
public function execute() {
$this->editor->undo();
}
}
<?php
class Button {
private $command;
public function __construct(Command $command) {
$this->command = $command;
}
public function click() {
$this->command->execute();
}
}
<?php
$editor = new Editor();
$copyButton = new Button(new CopyCommand($editor));
$pasteButton = new Button(new PasteCommand($editor));
$undoButton = new Button(new UndoCommand($editor));
$copyButton->click();
$pasteButton->click();
$undoButton->click();
Metin kopyalandı.
Metin yapıştırıldı.
Son işlem geri alındı.
Avantajları
-
Komutlar arasında gevşek bağlılık sağlar (loose coupling)
-
Geri alma, kaydetme, kuyruklama yapılabilir
-
Yeni komutlar kolayca eklenebilir
-
Arayüzler ile kodun mantığını birbirinden ayırır
Ekstra Bilgi:
Command desenini Laravel gibi modern framework'lerde şu alanlarda görebilirsin:
-
php artisan make:command
-
dispatch(new SendEmailJob())
-
Form işlemleri ve Button Click Event handler sistemleri