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
- phpcurl调用本地函数(PHP使用CURL实现下载文件功能示例)
- php如何获取当前日期(php实现获取近几日、月时间示例)
- php经典算法大全(php菜单/评论数据递归分级算法的实现方法)
- php 支付系统(php 实现银联商务H5支付的示例代码)
- php框架使用方法大全(PHP MVC框架中类的自动加载机制实例分析)
- php 各类商品结算算法(PHP实现财务审核通过后返现金额到客户的功能)
- phpstudyv8.0使用教程学习(phpStudy环境安装SSL证书教程)
- docker下怎么搭建一个php环境(Docker搭建php环境教程详解)
- php建造者模式实例(PHP工厂模式、单例模式与注册树模式实例详解)
- php中怎么分割数组(PHP实现数组根据某个字段进行水平合并,横向合并案例分析)
- thinkphp5框架怎么打开(thinkphp5.1框架中容器Container和门面Facade的实现方法分析)
- php的数组是如何实现的(PHP中遍历数组的三种常用方法实例分析)
- php模块使用方法(PHP操作XML中XPath的应用示例)
- php返回数组值最大的键(PHP实现通过二维数组键值获取一维键名操作示例)
- php安全性问题怎么解决(实例分析10个PHP常见安全问题)
- phpstudy中apache到期如何修改(phpStudy找不到Apache“服务名” 解决方法)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
- 小米音乐与 QQ 音乐合作,便捷迁移会员(小米音乐与QQ音乐合作)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
- 贾怀胤唱《白龙马》 炸场 了 没想到京剧还能这么玩(贾怀胤唱白龙马)
热门推荐
- java怎么调用支付宝的扫码支付(python实现银联支付和支付宝支付接入)
- docker端口映射详解(docker 启用多个端口映射命令的操作)
- 美国云服务器的优点(美国哪个机房的云主机比较稳定?)
- vue引入axios(vue封装axios的几种方法)
- docker 挂载目录权限(docker windows10 共享目录挂载失败的解决方案)
- 实用的Visual Studio插件
- , , 的区别
- sql server没有服务器怎么办(SQL Server 2012安装后服务器名称找不到的解决办法)
- javascript制作表格(JavaScript实现动态表格效果)
- mysql8.0.15安装详细教程(Mysql8.0.22解压版安装教程小白专用)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9