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 相关文章推荐
打造计数器DIY三步曲(下)
Oct 09 PHP
PHP 类商品秒杀计时实现代码
May 05 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
解析php file_exists无效的解决办法
Jun 26 PHP
Drupal7中常用的数据库操作实例
Mar 02 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
php array_key_exists() 与 isset() 的区别
Oct 24 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 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
windows xp下安装pear
2006/12/02 PHP
php获取根域名方法汇总
2014/10/28 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
js实现抽奖功能
2020/11/24 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Python连接phoenix的方法示例
2017/09/29 Python
python实现简单神经网络算法
2018/03/10 Python
python八皇后问题的解决方法
2018/09/27 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python
Python必备技巧之字符数据操作详解
2022/03/23 Python