State Pattern (Nhóm hành vi)

Cho phép một đối tượng THAY ĐỔI HÀNH VI khi trạng thái bên trong của nó thay đổi. Gia tăng tính linh hoạt, phân chia trách nhiệm rõ ràng giữa các trạng thái, tăng khả năng bảo trì.

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

Bài toán kinh điển nhất: thay đổi trạng thái đơn hàng - đơn mới tiếp nhận thì nhân viên lấy hàng được quyền thao tác; đơn đã giao thì không được tác động nữa. Bất kể khi nào hành vi của đối tượng có thể thay đổi bởi trạng thái của nó, nghĩ tới State Pattern.

Ví dụ

<?php
// Interface trạng thái đơn: cho phép đơn được thao tác hay không
interface OrderState {
    public function getStatus();
    public function allowProcessing();
}
 
// Mỗi trạng thái là một class riêng biệt để phân chia trách nhiệm xử lý logic
class NewOrderState implements OrderState {
    public function getStatus() { return 'New'; }
    public function allowProcessing() { return true; }   // cho phép tác động
}
 
class ShippedOrderState implements OrderState {
    public function getStatus() { return 'Shipped'; }
    public function allowProcessing() { return false; }  // không cho tác động
}
 
class Order {
    private $state;
 
    public function __construct() {
        $this->state = new NewOrderState();  // khởi tạo bằng trạng thái New
    }
 
    public function setState(OrderState $state) { $this->state = $state; }
 
    // Hành vi ỦY QUYỀN cho object trạng thái hiện tại
    public function getStatus() { return $this->state->getStatus(); }
    public function allowProcessing() { return $this->state->allowProcessing(); }
}
 
$order = new Order();
$order->allowProcessing();                    // true
$order->setState(new ShippedOrderState());
echo $order->getStatus();                     // Shipped
$order->allowProcessing();                    // false

Thay vì if/else theo status rải rác khắp nơi, mỗi trạng thái là một class - logic của trạng thái nào nằm gọn trong class đó.

Liên quan