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
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
PHP中将网页导出为Word文档的代码
May 25 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
PHP读取大文件的类SplFileObject使用介绍
Apr 09 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
PHP实现根据时间戳获取周几的方法
Feb 26 PHP
php实现xml与json之间的相互转换功能实例
Jul 07 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 PHP
PHP变量的作用范围实例讲解
Dec 22 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
JavaScript引用类型Array实例分析
2018/07/24 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
js中null与空字符串&quot;&quot;的区别讲解
2019/01/17 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
Python Xml文件添加字节属性的方法
2018/03/31 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
仓库班组长岗位职责
2013/12/12 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
对祖国的寄语大全
2014/04/11 职场文书
中文专业自荐书
2014/06/29 职场文书
护理医院见习报告
2014/11/03 职场文书
迟到检讨书范文
2015/01/27 职场文书
西游记读书笔记
2015/06/25 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
我收到了德劲DE1107
2022/04/05 无线电