「PHP」观察者模式模式
- 《大话设计模式》程杰
<?php
/**
* 抽象观察者
*/
namespace observer_factory; abstract class ObserverAbstract
{
public abstract function update($news);
}
<?php /**
* 正在玩的员工
*/
namespace observer_factory; class NbaObserver extends ObserverAbstract
{
protected $name; protected $secretary; public function __construct(string $name, SubjectInterface $secretary)
{
$this->name = $name; $this->secretary = $secretary;
} /**
* 收到通知后的具体操作
* @param $news
*/
public function update($news)
{
echo $this->name.$news.'不要在玩了,继续工作!';
}
}
<?php
/**
* 正在炒股的用户
*/
namespace observer_factory; class StockObserver extends ObserverAbstract
{
protected $name; protected $secretary; public function __construct(string $name, SubjectInterface $secretary)
{
$this->name = $name; $this->secretary = $secretary;
}
/**
* 收到通知后的具体操作
* @param $news
*/
public function update($news)
{
echo $this->name.$news.'不要在看股票,继续工作!';
}
}
2. 抽象通知者,具体通知者
<?php
/**
* 抽象通知者
*/
namespace observer_factory; interface SubjectInterface
{
/**
* 增加同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function attach($key, ObserverAbstract $observer); /**
* 删除同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function detach($key); /**
* 发送消息
*/
public function notify(); /**
* @param $news
*/
public function secretaryNews($news);
}
<?php
/**
* 通知者A
*/
namespace observer_factory; class SubjectA implements SubjectInterface
{
/**
* 同事列表
*/
private $list = []; private $news; /**
* 增加同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function attach($key, ObserverAbstract $observer)
{
$this->list[$key] = $observer;
} /**
* 删除同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function detach($key)
{
unset($this->list[$key]);
} /**
* 发送消息
*/
public function notify()
{
foreach ($this->list AS $val) {
$val->update($this->news);
}
} /**
* @param $news
*/
public function secretaryNews($news)
{
$this->news = $news;
}
}
<?php namespace observer_factory; class SubjectB implements SubjectInterface
{
/**
* 同事列表
*/
private $list = []; private $news; /**
* 增加同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function attach($key, ObserverAbstract $observer)
{
$this->list[$key] = $observer;
} /**
* 删除同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function detach($key)
{
unset($this->list[$key]);
} /**
* 发送消息
*/
public function notify()
{
foreach ($this->list AS $val) {
$val->update($this->news);
}
} /**
* @param $news
*/
public function secretaryNews($news)
{
$this->news = $news;
}
}
3. 测试
<?php namespace observer_factory; include '../autoload.php'; // 通知者A 进行通知
$tongzhizhe = new SubjectA();
$tongshi1 = new NbaObserver('用户A', $tongzhizhe);
$tongshi2 = new StockObserver('用户B', $tongzhizhe); $tongzhizhe->attach('用户A', $tongshi1);
$tongzhizhe->attach('用户B', $tongshi2); $tongzhizhe->secretaryNews('老板回来了');
$tongzhizhe->notify();
GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master
「PHP」观察者模式模式的更多相关文章
- 「PHP」策略模式
引言 所属:行为型模式,常用设计模式之一 学习资料: <大话设计模式>程杰 模式概述 分享一篇关于策略模式讲的很好的文章,大家可以参考一下:https://www.cn ...
- 「技巧」如何将Sketch改为深色模式
之前Sketch只能根据mac系统的外观设置变更皮肤.在更新了版本54之后,可以脱离操作系统,在自己的偏好设置中更改外观了. 准备 Sketch 54 更多工具:whose.design 第一步:打开 ...
- 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式
1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-2-6」TokuMX and MongoDB related materials collection
简介参考 TokuMX 和 MongoDB 各自的官方站点. ## Tokutek 最重要的特点和 marketing word 是所谓 fractal tree indexing te ...
- jvm系列(十):如何优化Java GC「译」
本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...
- React + Node 单页应用「二」OAuth 2.0 授权认证 & GitHub 授权实践
关于项目 项目地址 预览地址 记录最近做的一个 demo,前端使用 React,用 React Router 实现前端路由,Koa 2 搭建 API Server, 最后通过 Nginx 做请求转发. ...
随机推荐
- PHP discuz模板语法
Discuz! X 模板的解析主要是 ./source/class/class_template.php 文件解析处理的,如果需要深入了解请可以看看这个文件! 模板嵌套语法 将被嵌套模板内容解析为 P ...
- Dubbo框架介绍与安装 Dubbo 注册中心(Zookeeper-3.4.6)
背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. • 单一应用架构 • 当网站流量很小时, ...
- HTML,javascript,image等加载,DOM解析,js执行生命周期
- CVE-2015-1642 POC
月初,玄武实验室的“每日安全动态”推送了一篇office UAF漏洞利用的文章,之前对office上UAF漏洞利用占位问题有些疑问,刚好就借助这篇文章重现了一下.其中堆喷射部分不是特别稳定,漏洞成因和 ...
- zabbix 添加 ROS 软路由监控 WinBox设置
如图设置
- June 23rd 2017 Week 25th Friday
Life doesn't get easier, you just get stronger. 生活从未变得轻松,是你在一点一点变得坚强. So in the same way we can get ...
- January 25 2017 Week 4 Wednesday
In every triumph, there's a lot of try. 每个胜利背后都有许多尝试. There's a lot of try behind every success, and ...
- 在一个jsp页面中引用另一个jsp文件的路径的问题
为了提高代码的重用性,经常需要在一个jsp页面中引用另一个jsp文件的代码.关于引用时的路径的问题.下面只介绍动态引用的,我觉得静态引用的应该也一样. 相对路径: 一.在同一个文件夹下,a.jsp中引 ...
- BZOJ5293:[BJOI2018]求和(LCA,差分)
Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k 次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...
- redis-desktop-manager 安装——redis的可视化工具
一.redis-desktop-manager介绍 Redis可视化工具之一,RedisDesktopManager是开源的,托管在github上:https://github.com/uglide/ ...