推荐答案
// www.javascriptcn.com code example
<?php
// 主题接口
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) {
$this->observers = array_filter($this->observers, function($obs) use ($observer) {
return $obs !== $observer;
});
}
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) {
echo "Observer " . $this->name . " has been notified. New state: " . $subject->getState() . "\n";
}
}
// 使用示例
$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver("Observer 1");
$observer2 = new ConcreteObserver("Observer 2");
$subject->attach($observer1);
$subject->attach($observer2);
$subject->setState("State 1");
$subject->setState("State 2");
$subject->detach($observer1);
$subject->setState("State 3");
?>本题详细解读
观察者模式概述
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
实现步骤
定义主题接口(Subject):主题接口定义了三个方法:
attach、detach和notify。attach用于添加观察者,detach用于移除观察者,notify用于通知所有观察者。定义观察者接口(Observer):观察者接口定义了一个
update方法,当主题状态发生变化时,主题会调用观察者的update方法。实现具体主题类(ConcreteSubject):具体主题类实现了主题接口,并维护了一个观察者列表。当主题状态发生变化时,调用
notify方法通知所有观察者。实现具体观察者类(ConcreteObserver):具体观察者类实现了观察者接口,并在
update方法中定义了收到通知后的行为。使用示例:创建主题对象和观察者对象,将观察者添加到主题中,然后改变主题的状态,观察者会自动收到通知并执行相应的操作。
关键点
- 松耦合:观察者模式使得主题和观察者之间的耦合度降低,主题不需要知道观察者的具体实现,只需要知道观察者接口。
- 动态添加/移除观察者:可以在运行时动态地添加或移除观察者,而不需要修改主题的代码。
- 通知机制:当主题状态发生变化时,所有观察者都会收到通知,并执行相应的更新操作。
通过观察者模式,可以实现一种灵活的通知机制,适用于需要处理对象间一对多依赖关系的场景。