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 使用post,get的一种简洁方式
Apr 25 PHP
php 归并排序 数组交集
May 10 PHP
解析crontab php自动运行的方法
Jun 24 PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 PHP
linux下实现定时执行php脚本
Feb 13 PHP
Windows7下的php环境配置教程
Feb 28 PHP
基于JQuery+PHP编写砸金蛋中奖程序
Sep 08 PHP
php workerman定时任务的实现代码
Dec 23 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 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创建session的方法实例详解
2015/01/27 PHP
php显示时间常用方法小结
2015/06/05 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
实例解析Python中的__new__特殊方法
2016/06/02 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
基于python调用psutil模块过程解析
2019/12/20 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
日本小田急百货官网:Odakyu
2018/07/19 全球购物
企业员工集体活动方案
2014/08/17 职场文书
医院科室评语
2015/01/04 职场文书
给病人的慰问信
2015/03/23 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
Python 如何实现文件自动去重
2021/06/02 Python
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫
virtualenv隔离Python环境的问题解析
2022/06/21 Python