PHP设计模式(观察者模式)


Posted in PHP onJuly 07, 2021

PHP 设计模式之观察者模式

介绍

现在有两派,有的人建议使用设计模式,有的人不建议使用设计模式! 这就向写文章一样,有的人喜欢文章按照套路走,比如叙事性质的文章,时间,地点,人物,事件。而有的人喜欢写杂文或者散文,有的人喜欢写诗词! 现在写代码很多地方类似于写文章,但是在有些地方比写文章需要更多的技能!写文章写多了一般也能写出优秀的文章,而代码也一样,写多了也能写出很多有些的代码! 很多时候,我看设计模式的时候,有些设计模式只是吻合我的代码习惯。但是你硬去套它,那么反而适得其反。——很多时候是学会了招式,在应用中不知不觉的使用上这些招式,才能掌握其道,但是也不要拘泥于招式,正所谓“无招胜有招”吗? 我学设计模式的初衷,就是知道有这么个玩意儿?脑子里有这么个印象,也不会生套它!如果设计模式不符合你的习惯对你阅读代码反而是不利的! 观察者模式定义对象的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新!

设计原则

在观察者模式中,会改变的是主题的状态以及观察者的数目。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。——找出程序中会变化的方面,然后将其和固定不变的方面相分离! 主题和观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点! ——针对接口编程,不针对实现编程! 观察者模式利用“组合”将许多观察者组合进主题中。对象(观察者——主题)之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式产生的。 ——多用组合,少用继承!

代码

<?php
/**
 * 观察者模式
 * @author: Mac
 * @date: 2012/02/22
 */ 
class Paper{ /* 主题    */
    private $_observers = array();
 
    public function register($sub){ /*  注册观察者 */
        $this->_observers[] = $sub;
    }
    public function trigger(){  /*  外部统一访问    */
        if(!empty($this->_observers)){
            foreach($this->_observers as $observer){
                $observer->update();
            }
        }
    }
} 
/**
 * 观察者要实现的接口
 */
interface Observerable{
    public function update();
} 
class Subscriber implements Observerable{
    public function update(){
        echo "Callback\n";
    }
}

下面是测试代码

/*  测试    */
$paper = new Paper();
$paper->register(new Subscriber());
//$paper->register(new Subscriber1());
//$paper->register(new Subscriber2());
$paper->trigger();

总结

当新对象要填入的时候,只需要在主题(又叫可观察者)中进行注册(注册方式很多,你也可以在构造的时候,或者框架访问的接口中进行注册),然后实现代码直接在新对象的接口中进行。这降低了主题对象和观察者对象的耦合度。 好的设计模式不会直接进入你的代码中,而是进入你的大脑中。

到此这篇关于PHP设计模式(观察者模式)的文章就介绍到这了,更多相关PHP 观察者模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
Oracle Faq(Oracle的版本)
Oct 09 PHP
留言板翻页的实现详解
Oct 09 PHP
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
php数组函数序列之in_array() 查找数组值是否存在
Oct 29 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
php生成数字字母的验证码图片
Jul 14 PHP
CI映射(加载)数据到view层的方法
Mar 28 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 PHP
eval(cmd)与eval($cmd)的区别与联系
用php如何解决大文件分片上传问题
Jul 07 #PHP
php 文件上传至OSS及删除远程阿里云OSS文件
Jul 04 #PHP
PHP实现两种排课方式
Linux系统下安装PHP7.3版本
详细分析PHP7与PHP5区别
Jun 26 #PHP
laravel添加角色和模糊搜索功能的实现代码
You might like
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
DIY实用性框形天线
2021/03/02 无线电
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
jQuery性能优化的38个建议
2014/03/04 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
Vue动态获取width的方法
2018/08/22 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Python装饰器知识点补充
2018/05/28 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
Series和DataFrame使用简单入门
2019/11/13 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
解决python对齐错误的方法
2020/07/16 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
银行授权委托书范本
2014/10/04 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
毕业生入职感言
2015/07/31 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书