以下是一个简单的 PHP 观察者模式的示例:
<?php
// 主题接口
interface Subject {
public function addObserver(Observer $observer);
public function removeObserver(Observer $observer);
public function notifyObservers();
}
// 观察者接口
interface Observer {
public function update($data);
}
// 具体主题类
class ConcreteSubject implements Subject {
private $observers = [];
private $state;
public function addObserver(Observer $observer) {
$this->observers[] = $observer;
}
public function removeObserver(Observer $observer) {
$index = array_search($observer, $this->observers);
if ($index !== false) {
unset($this->observers[$index]);
}
}
public function setState($state) {
$this->state = $state;
$this->notifyObservers();
}
public function notifyObservers() {
foreach ($this->observers as $observer) {
$observer->update($this->state);
}
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function update($data) {
echo "Observer $this->name received update with data: $data\n";
}
}
// 客户端代码
$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver("Observer1");
$observer2 = new ConcreteObserver("Observer2");
$subject->addObserver($observer1);
$subject->addObserver($observer2);
$subject->setState("State1");
$subject->setState("State2");
$subject->removeObserver($observer1);
$subject->setState("State3");
在这个例子中,Subject 接口定义了主题的基本方法,包括添加、删除和通知观察者。Observer 接口定义了观察者的基本方法,包括更新方法。
ConcreteSubject 类是具体的主题类,负责维护观察者列表并通知它们。ConcreteObserver 类是具体的观察者类,实现了更新方法,用于接收主题的通知。
客户端代码创建了一个具体主题对象和两个具体观察者对象,并通过添加、删除观察者和设置主题状态来演示观察者模式的使用。
观察者模式的优点在于它实现了主题和观察者之间的松耦合,允许在不修改主题或观察者代码的情况下增加新的观察者。这样的设计模式非常适用于事件驱动的系统。
转载请注明出处:http://www.pingtaimeng.com/article/detail/11959/PHP