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一些服务器端特性的配置加强php的安全
Oct 09 PHP
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
Oct 21 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
Oct 30 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
PHP单例模式详细介绍
Jul 01 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
php根据命令行参数生成配置文件详解
Mar 15 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
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
php广告加载类用法实例
2014/09/23 PHP
discuz目录文件资料汇总
2014/12/30 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
js自定义事件代码说明
2011/01/31 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
python基础教程之udp端口扫描
2014/02/10 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
市场营销毕业生自荐信
2013/11/23 职场文书
材料加工工程求职信
2014/02/19 职场文书
班风学风建设方案
2014/05/06 职场文书
大学生个人求职信例文
2014/07/07 职场文书
党员创先争优心得体会
2014/09/11 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
心灵点滴观后感
2015/06/02 职场文书
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL