观察者模式定义
观察者模式定义了对象间的一对多依赖,当一个对象状态改变时,所有依赖者自动更新。
代码实现
// 事件接口
interface Event {}
// 监听器接口
interface Listener {
public function handle(Event $event): void;
}
// 事件分发器
class EventDispatcher {
private array $listeners = [];
public function addListener(string $eventClass, Listener $listener): void {
$this->listeners[$eventClass][] = $listener;
}
public function dispatch(Event $event): void {
$class = get_class($event);
foreach ($this->listeners[$class] ?? [] as $listener) {
$listener->handle($event);
}
}
}
// 自定义事件
class UserRegisteredEvent implements Event {
public function __construct(public string $email) {}
}
// 监听器
class SendWelcomeEmailListener implements Listener {
public function handle(Event $event): void {
if ($event instanceof UserRegisteredEvent) {
echo "发送欢迎邮件到 {$event->email}";
}
}
}
class CreateProfileListener implements Listener {
public function handle(Event $event): void {
echo "创建用户资料";
}
}
// 使用
$dispatcher = new EventDispatcher();
$dispatcher->addListener(UserRegisteredEvent::class, new SendWelcomeEmailListener());
$dispatcher->addListener(UserRegisteredEvent::class, new CreateProfileListener());
$dispatcher->dispatch(new UserRegisteredEvent('user@example.com'));Laravel 事件系统
Laravel 提供了优雅的事件/监听器实现:
php artisan make:event UserRegistered
php artisan make:listener SendWelcomeEmail --event=UserRegistered在 EventServiceProvider 注册,然后 event(new UserRegistered($user)) 触发。
观察者模式让业务解耦,扩展性极强,是大型项目的常用架构。
