观察者模式(Observer Pattern)是一种行为设计模式,用于在对象之间建立一对多的依赖关系,当一个对象(被观察者/主题)的状态发生变化时,所有依赖它的对象(观察者)会自动收到通知并更新。
核心方法:attach()
, detach()
, notify()
。
update()
。// 主题接口
interface Subject {
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
// 观察者接口
interface Observer {
public function update(Subject $subject);
}
class ConcreteSubject implements Subject {
private $observers = [];
private $state;
// 注册观察者
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
// 移除观察者
public function detach(Observer $observer) {
$index = array_search($observer, $this->observers);
if ($index !== false) {
unset($this->observers[$index]);
}
}
// 通知所有观察者
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
// 修改状态并触发通知
public function setState($state) {
$this->state = $state;
$this->notify();
}
// 获取状态
public function getState() {
return $this->state;
}
}
class ConcreteObserver implements Observer {
private $name;
public function __construct($name) {
$this->name = $name;
}
// 观察者收到通知后的响应逻辑
public function update(Subject $subject) {
$state = $subject->getState();
echo "观察者 {$this->name} 收到通知:主题状态已更新为 {$state}\n";
}
}
// 创建主题
$subject = new ConcreteSubject();
// 创建观察者并注册
$observer1 = new ConcreteObserver("Observer 1");
$observer2 = new ConcreteObserver("Observer 2");
$subject->attach($observer1);
$subject->attach($observer2);
// 修改主题状态,触发通知
$subject->setState("新状态");
// 输出:
// 观察者 Observer 1 收到通知:主题状态已更新为 新状态
// 观察者 Observer 2 收到通知:主题状态已更新为 新状态
// 移除一个观察者
$subject->detach($observer2);
$subject->setState("更新后的状态");
// 输出:
// 观察者 Observer 1 收到通知:主题状态已更新为 更新后的状态
观察者模式通过定义对象间的一对多依赖关系,实现了状态变化的自动通知机制,是解耦和动态扩展的经典设计模式。在 PHP 中,可以通过接口和类轻松实现,适用于需要实时响应状态变化的场景。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。