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之PHP语法学习笔记1
Dec 17 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
PHP递归实现层级树状展开
Apr 01 PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 PHP
理清PHP在Linxu下执行时的文件权限方法
Jun 07 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
Oct 11 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
详解使用php-cs-fixer格式化代码
Sep 16 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生成UTF8文件的方法
2010/05/15 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
详解PHP中的PDO类
2015/07/06 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
javascript操作css属性
2013/12/30 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
mac 安装python网络请求包requests方法
2018/06/13 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
时尚休闲吧创业计划书
2014/01/25 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
生日宴会策划方案
2014/06/03 职场文书
单位未婚证明范本
2014/11/25 职场文书
瘦西湖导游词
2015/02/03 职场文书
朋友聚会开场白
2015/06/01 职场文书