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 相关文章推荐
BBS(php &amp; mysql)完整版(四)
Oct 09 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
Apr 21 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
php检测图片主要颜色的方法
Jul 01 PHP
PHP会话处理的10个函数
Aug 11 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
yii2实现Ueditor百度编辑器的示例代码
Nov 02 PHP
PHP实现百度人脸识别
May 06 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 PHP
PHP http请求超时问题解决方案
Nov 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
Java中final关键字详解
2015/08/10 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
读jQuery之一(对象的组成)
2011/06/11 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
用Python编写简单的微博爬虫
2016/03/04 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
python交换两个变量的值方法
2019/01/12 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
python中xlrd模块的使用详解
2021/02/01 Python
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
学术会议邀请函范文
2014/01/22 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
上海世博会口号
2014/06/19 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
用Python selenium实现淘宝抢单机器人
2021/06/18 Python