PHP中如何实现观察者模式?
观察者模式是一种行为设计模式,允许你定义一种订阅机制,可以在对象状态改变时通知多个依赖对象。以下是一个简单的PHP观察者模式实现:
// Subject(主题)接口
interface Subject {
public function registerObserver(Observer $observer);
public function removeObserver(Observer $observer);
public function notifyObservers();
}
// ConcreteSubject(具体主题)类
class ConcreteSubject implements Subject {
private $observers = [];
private $state;
public function getState() {
return $this->state;
}
public function setState($state) {
$this->state = $state;
$this->notifyObservers();
}
public function registerObserver(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 notifyObservers() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
}
// Observer(观察者)接口
interface Observer {
public function update(Subject $subject);
}
// ConcreteObserver(具体观察者)类
class ConcreteObserver implements Observer {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function update(Subject $subject) {
echo "{$this->name} received an update: " . $subject->getState() . "<br>";
}
}
// 使用示例
$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver("Observer 1");
$observer2 = new ConcreteObserver("Observer 2");
$subject->registerObserver($observer1);
$subject->registerObserver($observer2);
$subject->setState("New State");
在这个例子中,我们定义了一个Subject
接口和一个ConcreteSubject
类来实现主题的功能。我们还定义了一个Observer
接口和一个ConcreteObserver
类来实现观察者的功能。当ConcreteSubject
的状态发生变化时,它会通知所有注册的观察者。