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 相关文章推荐
玩转虚拟域名◎+ .
Oct 09 PHP
PHP迅雷、快车、旋风下载专用链转换代码
Jun 15 PHP
PHP 函数学习简单小结
Jul 08 PHP
PHP 数组基础知识小结
Aug 20 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
Yii安装与使用Excel扩展的方法
Jul 13 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
Mar 31 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
Dec 07 PHP
laravel中Redis队列监听中断的分析
Sep 14 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
js 调整select 位置的函数
2008/02/21 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
input框中的name和id的区别
2016/11/16 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
es6数值的扩展方法
2019/03/11 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
Selenium定位元素操作示例
2018/08/10 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
中学劳技课教师的自我评价
2014/02/05 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
读书之星事迹材料
2014/05/12 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
受伤赔偿协议书
2014/09/24 职场文书
六查六看剖析材料
2014/10/06 职场文书
优秀党员事迹材料
2014/12/18 职场文书
趣味运动会广播稿
2015/08/19 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js