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 相关文章推荐
PHP输出控制功能在简繁体转换中的应用
Oct 09 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 PHP
邮箱正则表达式实现代码(针对php)
Jun 21 PHP
PHP扩展模块memcached长连接使用方法分析
Dec 24 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
CakePHP框架Session设置方法分析
Feb 23 PHP
php7 安装yar 生成docker镜像
May 09 PHP
浅析PHP数据导出知识点
Feb 17 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
PHP7数组的底层实现示例
Aug 25 PHP
详解Laravel服务容器的优势
May 29 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
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
记录几个javascript有关的小细节
2007/04/02 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
朴素贝叶斯算法的python实现方法
2014/11/18 Python
简洁的十分钟Python入门教程
2015/04/03 Python
python实现将内容分行输出
2015/11/05 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
Python实现的计算马氏距离算法示例
2018/04/03 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
python的concat等多种用法详解
2018/11/28 Python
python读取各种文件数据方法解析
2018/12/29 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
python遍历路径破解表单的示例
2020/11/21 Python
Python运算符+与+=的方法实例
2021/02/18 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
医学生个人求职信范文
2013/09/24 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
生产车间管理制度
2015/08/04 职场文书
幼儿园心得体会范文
2016/01/21 职场文书