文章摘要
这篇文章介绍了 ** observer 模式 **(观察者模式)及其在 PHP 中的实现。文章通过定义 `Subject` 和 `Observer` 接口,以及 `ConcreteSubject` 和 `ConcreteObserver` 类,详细说明了如何通过注册和取消注册观察者来实现事件驱动的组件交互。具体实现包括:
1. `Subject` 接口定义了 `attach`、`detach` 和 `notify` 方法。
2. `Observer` 接口定义了 `update` 方法,用于接收 `Subject` 的状态更新。
3. `ConcreteSubject` 实现了观察者模式的核心逻辑,通过维护一个 `$observers` 数组来管理注册的观察者,并在 `notify` 方法中将所有注册的观察者更新状态。
4. `ConcreteObserver` 通过 `update` 方法接收并存储 `Subject` 的状态。
文章还通过示例展示了如何使用观察者模式。例如,创建两个 `ConcreteObserver` 实例,注册到 `ConcreteSubject` 上,并通过调用 `setState` 方法观察状态变化。即使在动态取消注册后,剩余的观察者仍然能够接收最新的状态更新。
总结来说,文章重点介绍了 observer 模式的实现及其在实际应用中的使用场景,展示了如何通过事件驱动的方式实现组件间的动态交互。
<?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) {
$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 getState() {
return $this->state;
}
public function setState($state) {
$this->state=$state;
$this->notify();
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
private $state;
public function update(Subject $subject) {
$this->state=$subject->getState();
}
public function getState() {
return $this->state;
}
}
// 使用观察者模式
$subject=new ConcreteSubject();
$observer1=new ConcreteObserver();
$observer2=new ConcreteObserver();
$subject->attach($observer1);
$subject->attach($observer2);
$subject->setState(“State 1”);
echo $observer1->getState(); // 输出:State 1
echo $observer2->getState(); // 输出:State 1
$subject->setState(“State 2”);
echo $observer1->getState(); // 输出:State 2
echo $observer2->getState(); // 输出:State 2
$subject->detach($observer2);
$subject->setState(“State 3”);
echo $observer1->getState(); // 输出:State 3
echo $observer2->getState(); // 输出:State 2
// 主题接口
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 getState() {
return $this->state;
}
public function setState($state) {
$this->state=$state;
$this->notify();
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
private $state;
public function update(Subject $subject) {
$this->state=$subject->getState();
}
public function getState() {
return $this->state;
}
}
// 使用观察者模式
$subject=new ConcreteSubject();
$observer1=new ConcreteObserver();
$observer2=new ConcreteObserver();
$subject->attach($observer1);
$subject->attach($observer2);
$subject->setState(“State 1”);
echo $observer1->getState(); // 输出:State 1
echo $observer2->getState(); // 输出:State 1
$subject->setState(“State 2”);
echo $observer1->getState(); // 输出:State 2
echo $observer2->getState(); // 输出:State 2
$subject->detach($observer2);
$subject->setState(“State 3”);
echo $observer1->getState(); // 输出:State 3
echo $observer2->getState(); // 输出:State 2
© 版权声明
文章版权归作者所有,未经允许请勿转载。