Observer Pattern (Nhóm hành vi)
Cho phép xác định một CƠ CHẾ ĐĂNG KÝ để nhiều đối tượng nhận thông báo về các sự kiện xảy ra đối với đối tượng mà chúng đang quan tâm. Giúp tách biệt code: các đối tượng lắng nghe (observer) không phụ thuộc chặt chẽ vào đối tượng gốc → ứng dụng linh hoạt hơn rất nhiều.
🔍 Dấu hiệu nhận biết
Cần kích hoạt một loạt hành vi theo sau một sự kiện. Ví dụ: đơn đặt hàng thành công → gửi mail thông báo, trừ kho hàng hoá… Không dùng Observer: phải kích hoạt trực tiếp trong phương thức xử lý đặt hàng. Với Observer: chỉ cần gửi một sự kiện, các class đã đăng ký tuỳ ý xử lý theo nghiệp vụ riêng.
Ví dụ: trạng thái đơn hàng
<?php
// Subject: cho phép thêm (attach), bớt (detach), thông báo (notify) Observer
interface Subject {
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
interface Observer {
public function update($state);
}
class Order implements Subject {
private $observers = [];
private $state;
public function attach(Observer $observer) { $this->observers[] = $observer; }
public function detach(Observer $observer) {
$this->observers = array_filter($this->observers,
fn($o) => $o !== $observer);
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this->state);
}
}
// Trạng thái thay đổi → tự động thông báo tất cả Observer
public function setState($state) {
$this->state = $state;
$this->notify();
}
}
class CustomerObserver implements Observer {
public function update($state) {
echo "Customer: Your order status has changed to $state.\n";
}
}
class AdminObserver implements Observer {
public function update($state) {
echo "Admin: Order status has changed to $state.\n";
}
}
class WarehouseObserver implements Observer {
public function update($state) {
echo "Warehouse: Order status has changed to $state. Prepare for shipping.\n";
}
}
$order = new Order();
$order->attach(new CustomerObserver());
$order->attach($warehouse = new WarehouseObserver());
$order->setState('Processing'); // cả 2 observer đều nhận thông báo
$order->detach($warehouse); // tháo một observer
$order->setState('Delivered'); // chỉ CustomerObserver nhậnLiên quan
- Command Pattern, State Pattern - cùng nhóm hành vi
- Open Closed Principle - thêm observer mới không sửa Order
- Single Responsibility Principle - Laravel Listeners chính là observer đơn lẻ