「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 做请求转发. ...
随机推荐
- POI 导出excel带小数点的数字格式显示不对解决方法
最近看到了一个问题就是java导出excel中带小数点的数字显示不对, 比如我想在excel中第一行显示: 3,000.0 但是在excle中导出的格式总是不带小数点 3000(非文本格式),而且也 ...
- 爬虫入门之Scrapy框架基础rule与LinkExtractors(十一)
1 parse()方法的工作机制: 1. 因为使用的yield,而不是return.parse函数将会被当做一个生成器使用.scrapy会逐一获取parse方法中生成的结果,并判断该结果是一个什么样的 ...
- zimbra邮件服务器的搭建和迁移
背景: 公司最近由于服务器费用问题,需要将邮件服务器从亚马逊(新加坡)云服务器A迁移到阿里云(香港)云服务器B. 由于邮箱使用的是域名访问,但是没有进行备案,所以只能迁移到港澳台地区,才能正常使用. ...
- JavaScript返回上一页
目前来说有两种方法: window.history.back(); // 返回上一页不刷新 window.location.href = document.referrer; // 返回上一页并刷新
- shell 脚本中后台执行命令 &
最近遇到一个问题, 执行脚本,脚本调用 一个命令,命令(deamon)是一个守护进程,为了调试,取消了守护进程模式.导致命令后边的其他命令(echo "456")都无法执行. de ...
- TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等
本课主题 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...
- linux误删文件导致系统无法启动
因虚拟机RedHat误删了/etc/inittab文件导致系统无法启动启动系统提示enter runlevel尝试输入0-5都不好使.因为实验环境直接忽略了错误,重新搭建了虚拟机. 如果想尝试修复,可 ...
- ThinkPHP最新版本SQL注入漏洞
如下controller即可触发SQL注入: code 区域 public function test() { $uname = I('get.uname'); $u = M('user')-> ...
- 用CI框架向数据库中实现简单的增删改查
以下代码基于CodeIgniter_2.1.3版 用PHP向数据库中实现简单的增删改查(纯代码)请戳 http://www.cnblogs.com/corvoh/p/4641476.html Code ...
- DataTables.Queryable Sample
1.DataTables.Queryable的例子项目使用了SQL Server CE数据库,花了几分钟时间转为使用LocalDB. 完整Web.config文件如下: <?xml versio ...