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 相关文章推荐
Apache2 httpd.conf 中文版
Nov 17 PHP
PHP中数组的三种排序方法分享
May 07 PHP
php网页标题中文乱码的有效解决方法
Mar 05 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
自己写了一个php检测文件编码的函数
Apr 21 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
PHP实现图片批量打包下载功能
Mar 01 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
Nov 04 PHP
详解PHP中的8个魔术常量
Jul 06 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 json_encode奇怪问题说明
2011/09/27 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
php 浮点数比较方法详解
2017/05/05 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
js控制框架刷新
2008/08/01 Javascript
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
Python的垃圾回收机制深入分析
2014/07/16 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
python图像处理之镜像实现方法
2015/05/30 Python
Python温度转换实例分析
2018/01/17 Python
Django开发的简易留言板案例详解
2018/12/04 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
Python 远程开关机的方法
2020/11/18 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
幼儿园家长会欢迎词
2014/01/09 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
Python几种酷炫的进度条的方式
2022/04/11 Python