PHP设计模式之观察者模式浅析
作者:PHP隔壁老王邻居 发布时间:2023-05-27 12:20:11
PHP观察者模式(Observer Pattern)
观察者模式是一种行为设计模式,它定义了一种订阅机制,让一个或多个对象(观察者)自动被通知并更新,当被观察对象(主题)的状态发生改变时。这种模式非常适合在一个对象的状态变化需要影响其他对象时使用。
模式结构
观察者模式包含三个角色:
主题(Subject):它是被观察的对象,它维护着一个观察者集合,并提供了添加、删除和通知观察者的接口。
观察者(Observer):它定义了一个更新接口,当被观察对象发生改变时会被调用。
具体观察者(Concrete Observer):它实现了观察者接口,并存储了一些状态,当被观察对象发生改变时,它会被通知,并更新自己的状态。 转存失败重新上传取消
实现步骤
以下是实现观察者模式的步骤:
定义主题(Subject)接口,并在其中定义添加、删除和通知观察者的方法。
定义观察者(Observer)接口,并在其中定义更新方法。
定义具体主题(Concrete Subject)类,并实现主题接口中的方法。
定义具体观察者(Concrete Observer)类,并实现观察者接口中的方法。
在具体主题类中实现添加、删除和通知观察者的方法。当主题状态发生改变时,调用通知方法,通知所有观察者更新自己的状态。
代码示例
以下是一个简单的 PHP 实现观察者模式的示例:
<?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
在上面的示例中,我们定义了一个 ConcreteSubject
类来实现主题接口,并定义了一个 observers
数组来存储观察者。我们还定义了一个 ConcreteObserver
类来实现观察者接口,并存储了一些状态。我们使用 attach
方法将观察者添加到主题中,使用 detach
方法将观察者从主题中删除,并使用 setState
方法来设置主题的状态并通知观察者更新自己的状态。
适用场景
观察者模式适用于以下场景:
当一个对象的状态变化需要影响其他对象时。
当需要将一个对象的状态变化通知多个对象时。
当需要将一个对象和其他多个对象解耦时。
优点和缺点
观察者模式的优点包括:
它可以让主题和观察者之间解耦,使得它们可以独立地改变和扩展。
它可以支持广播通信,即一个主题可以通知多个观察者。
它可以提供了一种简单的订阅/发布机制。 观察者模式的缺点包括。
它可能会导致性能问题,特别是在通知大量观察者时。
观察者可能会收到不必要的通知,特别是在它们不关心主题的某些变化时。
来源:https://blog.csdn.net/weixin_39934453/article/details/129725274


猜你喜欢
- 5.0版本和之前版本的差异较大,本篇对熟悉3.2版本的用户给出了一些5.0的主要区别。URL和路由5.0的URL访问不再支持普通URL模式,
- 创建一个apps包 专门来放子应用创建users子应用 处理用户事务追加导包路径在settings中用 print(sys.path) 查看
- 本文实例分析了Python兔子毒药问题。分享给大家供大家参考。具体分析如下:问题大致是这样的:1000瓶无色无味的液体,其中一瓶为毒药,其它
- SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii('A') A,a
- 本文实例讲述了Sql Server事务语法及使用方法。分享给大家供大家参考,具体如下:事务是关于原子性的。原子性的概念是指可以把一些事情当做
- 每天面对成堆的发票,无论是发票还是承兑单据,抑或是其他各类公司数据要从照片、PDF等不同格式的内容中提取,我们都有必要进行快速办公的能力提升
- 前言Matplotlib的可以把很多张图画到一个显示界面,在作对比分析的时候非常有用。对应的有plt的subplot和figure的add_
- 下面从以下四种方案分析各自的优缺点。方案一:SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;
- 1、更新包管理 apt-get install update.2、安装 pip3 :apt-get install python3-pip3
- 关于with cube ,with rollup 和 grouping通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之
- 一 Protobuf介绍Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标
- IF Exists(Select 1 From sysobjects Where Name='sp_search' And
- MySql8.0 查看事务隔离级别报错问题数据库查看事务隔离级别select @@global.tx_isolation,@@tx_isol
- Django url pathDjango 路由在 urls.py 配置path('浏览器地址栏表示URL', '处
- 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性。在选择数据列类型时,请从以下几个方面考虑:存放到数据列中的数据类型。数据值
- 关于Variable和Tensor旧版本的Pytorch中,Variable是对Tensor的一个封装;在Pytorch大于v0.4的版本后
- 本文实例汇总了常用的JavaScript弹出窗口方法,供大家对比参考,希望能对大家有所帮助。详细方法如下:1.无提示刷新网页:大家有没有发现
- substr 定义和用法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。 语法 stringObject.
- 关于Python的格式化字符串,几乎所有接触过Python语言的人都知道其中一种,即使用运算符%,但对于绝大多数初学者来说也仅此而已。因此,
- If you want to give a specific user access from all machines in a give