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(); // falseThay 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
- Strategy Pattern - cấu trúc giống nhau; Strategy do client chọn, State tự chuyển theo trạng thái
- Observer Pattern - thường kết hợp: đổi state → notify observers
- Single Responsibility Principle - mỗi class một trạng thái