php设计模式如何实现(php模式设计之观察者模式应用实例分析)
php设计模式如何实现
php模式设计之观察者模式应用实例分析本文实例讲述了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程序设计有所帮助。
原文链接:https://www.cnblogs.com/DeanChopper/p/4830134.html
- phpstudy安装包打不开(phpStudy访问速度慢和启动失败的解决办法)
- php开发api接口登录(PHP调用接口API封装的例子)
- php定时执行PHP(Cpanel下Cron Jobs定时执行PHP的方法)
- php中isset函数有什么功能(PHP中的empty、isset、isnull的区别与使用实例)
- php闰年计算公式(php判断/计算闰年的方法小结三种方法)
- php 各类商品结算算法(PHP实现财务审核通过后返现金额到客户的功能)
- php构成方法的关键字是(PHP中的self关键字详解)
- php在没有命名空间之前是怎么调(php命名空间设计思想、用法与缺点分析)
- phpweb应用技术开发与数据库教程(IIS8 使用FastCGI配置PHP环境图文教程)
- php创建文件(php创建多级目录与级联删除文件的方法示例)
- thinkphp快速入门手册(从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解)
- phpstudy怎么修改mysql版本(PhpStudy集成环境升级MySQL数据库版本的方法)
- 虚拟机windows server安装php环境(winxp apache用php建本地虚拟主机的方法)
- php怎么修改单独一行数据(PHP实现批量修改文件名的方法示例)
- php微信公众号管理后台(php实现微信公众号创建自定义菜单功能的实例代码)
- phpstudy创建网站无权限(phpStudy配置多站点多域名和多端口的方法)
- 鱼竿 夏钓短,冬钓长 ,一定是这样 认清优缺点在选竿(鱼竿夏钓短冬钓长)
- 鲢鳙钓底还是钓浮 流水的水域应怎样做钓(鲢鳙钓底还是钓浮)
- 入秋后的第二场苹果发布会来了 全新M1系列芯片登场(入秋后的第二场苹果发布会来了)
- 苹果正式发布自研芯片M1 5nm 32核心 彻底放弃Intel(苹果正式发布自研芯片M1)
- 苹果自研芯片跑分对比 A16芯片排名靠后,M1系列霸榜(苹果自研芯片跑分对比)
- X86处理器的梦魇 苹果M1自研芯片到底有多强(苹果M1自研芯片到底有多强)
热门推荐
- django框架基础之路由详解(详解Django中CBVClass Base Views模型源码分析)
- mysql安装时服务无法启动(MySQL 实例无法启动的问题分析及解决)
- php的模块加载(PHP中的自动加载操作实现方法详解)
- , , 的区别
- jquery无缝滚动代码(jQuery实现表格行数据滚动效果)
- vuejs全家桶入门教程交流(Vue全家桶入门基础教程)
- python发送微信消息脚本(python实现微信定时每天和女友发送消息)
- windows服务器安装宝塔面板(云服务器无法安装宝塔面板及软件解决方案)
- mysqlsql语句的优化(MySQL优化之如何写出高质量sql语句)
- 看懂云服务器带宽大小的区别(云服务器的流量与带宽是如何换算?)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9