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
中国站长站 For Dede4.0 采集规则
May 27 PHP
PHP 数组和字符串互相转换实现方法
Mar 26 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
解析php函数method_exists()与is_callable()的区别
Jun 21 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
如何离线执行php任务
Feb 21 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP实现抽奖功能实例代码
Jun 30 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
Yii清理缓存的方法
2016/01/06 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
python中subprocess批量执行linux命令
2018/04/27 Python
详解Python3定时器任务代码
2019/09/23 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
创建索引时需要注意的事项
2013/05/13 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
毕业设计计划书
2014/01/09 职场文书
应届中专生自荐书范文
2014/02/13 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
应届生自荐信
2014/06/30 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
2014年科室工作总结
2014/11/20 职场文书
模范班主任事迹材料
2014/12/17 职场文书
跑吧孩子观后感
2015/06/10 职场文书
开学第一周总结
2015/07/16 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js