PHP设计模式之观察者模式浅析(观察者模式应用实例)没想到

随心笔谈2个月前发布 admin
212 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章简要介绍了 observer 模式及其在 PHP 中的实现。文章通过定义 `Subject` 和 `Observer` 接口,以及 `ConcreteSubject` 和 `ConcreteObserver` 类,展示了如何实现主题和观察者的绑定关系。具体实现包括: 1. `Subject` 接口定义了 `attach`、`detach` 和 `notify` 方法,用于绑定和通知观察者。2. `Observer` 接口定义了 `update` 方法,用于接收主题的状态更新。3. `ConcreteSubject` 类实现了 `Subject` 接口,通过维护观察者列表管理状态更新。4. `ConcreteObserver` 类实现了 `Observer` 接口,通过读取和写入主题状态实现反馈。5. 文章通过示例代码展示了如何通过实例化主题和观察者,绑定观察者,更新主题状态,并通过观察者获取最新状态。 文章重点在于通过具体的代码实现,演示了 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

© 版权声明

相关文章