Command Pattern (Nhóm hành vi)

Biến một YÊU CẦU thành một ĐỐI TƯỢNG ĐỘC LẬP chứa tất cả thông tin về yêu cầu đó, và sử dụng nó trở thành đầu vào cho class xử lý. Command giúp đóng gói nghiệp vụ, phân chia rõ ràng giữa luồng yêu cầu - xử lý (yêu cầu đóng vai trò tham số cho luồng xử lý, nên tách bạch rõ ràng các class xử lý với nhau).

🔍 Dấu hiệu nhận biết

  • Cần tách biệt yêu cầu của Hành động (Command) ra khỏi phần xử lý Hành động (Handler)
  • Cần tham số hoá các đối tượng dựa theo Hành động

Tác giả gợi ý tham khảo CommandBus Design Pattern (tương tự Command) trong cuốn “Thiết kế hướng nghiệp vụ với Laravel”.

Ví dụ: điều khiển đèn từ xa

<?php
interface Command {
    public function execute();
}
 
class TurnOnLightCommand implements Command {
    private $light;
    public function __construct(Light $light) { $this->light = $light; }
    public function execute() { $this->light->turnOn(); }
}
 
class TurnOffLightCommand implements Command {
    private $light;
    public function __construct(Light $light) { $this->light = $light; }
    public function execute() { $this->light->turnOff(); }
}
 
// Class được tương tác bởi Command
class Light {
    public function turnOn()  { echo "The light is on\n"; }
    public function turnOff() { echo "The light is off\n"; }
}
 
// Class nhận vào Command và gọi đến Handler tương ứng (Invoker)
class RemoteControl {
    private $command;
 
    public function setCommand(Command $command) { $this->command = $command; }
    public function pressButton() { $this->command->execute(); }
}
 
$light = new Light();
$remote = new RemoteControl();
 
$remote->setCommand(new TurnOnLightCommand($light));
$remote->pressButton(); // The light is on
 
$remote->setCommand(new TurnOffLightCommand($light));
$remote->pressButton(); // The light is off

RemoteControl không biết gì về Light - nó chỉ biết “execute một Command”. Yêu cầu được đóng gói (kèm mọi thông tin cần) → có thể truyền đi, xếp hàng (queue), log lại.

Liên quan