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 相关文章推荐
手把手教你使用DedeCms V3的在线采集图文教程
Apr 03 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
深入理解PHP中的global
Aug 19 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 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生成静态页面详解
2006/12/05 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
javaScript基础详解
2017/01/19 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
详细探究Python中的字典容器
2015/04/14 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
python学生管理系统
2019/01/30 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
如何获取某个日期是当月的最后一天
2013/12/05 面试题
正隆泰信息技术有限公司上机题
2012/06/14 面试题
物流毕业生个人的自我评价
2014/02/13 职场文书
财务部总监岗位职责
2014/03/12 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
2014年会计工作总结
2014/11/27 职场文书
医院党建工作总结2015
2015/05/26 职场文书
横空出世观后感
2015/06/09 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL