php模式设计之观察者模式应用实例分析


Posted in PHP onSeptember 25, 2019

本文实例讲述了php模式设计之观察者模式。分享给大家供大家参考,具体如下:

这是我写的《php模式设计》的第五篇。前面的四篇在不断学习不断加深认识,到了今天再看观察者模式,觉得非常容易理解。这也许就是我们积少成多的结果吧。希望还是能够不断进步。

开篇还是从名字说起,“观察者模式”的观察者三个字信息量很大。玩过很多网络游戏的童鞋们应该知道,即便是斗地主,除了玩家,还有一个角色叫“观察者"。在我们今天他谈论的模式设计中,观察者也是如此。首先,要有一个“主题”。只有有了一个主题,观察者才能搬着小板凳儿聚在一堆。其次,观察者还必须要有自己的操作。否则你聚在一堆儿没事做也没什么意义。

从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了。

从面向对象的角度来看,主题提供注册和通知的接口,观察者提供自身操作的接口。(这些观察者拥有一个同一个接口。)观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。耦合度相当之低。

如何实现观察者注册?通过前面的注册者模式很容易给我们提供思路,把这些对象加到一棵注册树上就好了嘛。如何通知?这就更简单了,对注册树进行遍历,让每个对象实现其接口提供的操作。

<?php
// 主题接口
interface Subject{
  public function register(Observer $observer);
  public function notify();
}
// 观察者接口
interface Observer{
  public function watch();
}
// 主题
class Action implements Subject{
   public $_observers=array();
   public function register(Observer $observer){
     $this->_observers[]=$observer;
   }
   public function notify(){
     foreach ($this->_observers as $observer) {
       $observer->watch();
     }
   }
 }
// 观察者
class Cat implements Observer{
   public function watch(){
     echo "Cat watches TV<hr/>";
   }
 } 
 class Dog implements Observer{
   public function watch(){
     echo "Dog watches TV<hr/>";
   }
 } 
 class People implements Observer{
   public function watch(){
     echo "People watches TV<hr/>";
   }
 }
// 应用实例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();

运行结果:

Cat watches TV
--------------------------------------------------------------------------------
People watches TV
--------------------------------------------------------------------------------
Dog watches TV
--------------------------------------------------------------------------------

所谓模式,更多的是一种想法,完全没必要拘泥于代码细节。观察者模式更多体现了两个独立的类利用接口完成一件本应该很复杂的事情。不利用主题类的话,我们还需要不断循环创建实例,执行操作。而现在只需要创建实例就好,执行操作的事儿只需要调用一次通知的方法就好啦。

从开始的单例模式我一步步考虑如何实现代码,到现在大部分实现代码一句带过,实际上是建立在前面不断积累的基础上。真心感觉通过不断学习设计模式能很大加深对面向对象编程的思考。当然纸上谈兵还是要不得的,最好还是投入更多的练习中去吧~~·

相关文章:《使用观察者模式处理异常信息》

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP安全配置
Oct 09 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
Apr 26 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
php中addslashes函数与sql防注入
Nov 17 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
php获取linux命令结果的实例
Mar 13 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
laravel实现于语言包的完美切换方法
Sep 29 PHP
php中yar框架实例用法讲解
Dec 27 PHP
php创建类并调用的实例方法
Sep 25 #PHP
关于php开启错误提示的总结
Sep 24 #PHP
php集成开发环境详解
Sep 24 #PHP
php和nginx交互实例讲解
Sep 24 #PHP
php连接mysql数据库最简单的实现方法
Sep 24 #PHP
php和html的区别点详细总结
Sep 24 #PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 #PHP
You might like
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
Seajs的学习笔记
2014/03/04 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
python中requests库session对象的妙用详解
2017/10/30 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
Python爬虫教程知识点总结
2020/10/19 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
食品安全处置方案
2014/06/14 职场文书
企业法人代表证明书
2014/09/27 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python