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 相关文章推荐
一道求$b相对于$a的相对路径的php代码
Aug 08 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
Aug 11 PHP
浅谈PHP中foreach/in_array的使用
Nov 02 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
Jan 17 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 PHP
thinkphp5使用无限极分类
Feb 18 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文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
php常量详细解析
2015/10/27 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Python fileinput模块使用介绍
2014/11/30 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
出资证明书范本(标准版)
2014/09/24 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
毕业实习计划书
2015/01/16 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python