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 相关文章推荐
CodeIgniter php mvc框架 中国网站
May 26 PHP
Php Cookie的一个使用注意点
Nov 08 PHP
PHP 在线翻译函数代码
May 07 PHP
php操作SVN版本服务器类代码
Nov 27 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
一个简单的PHP验证码实现代码
May 10 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
PHP attributes()函数讲解
Feb 03 PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 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
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
php猜单词游戏
2015/09/29 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
Python实现多线程下载文件的代码实例
2014/06/01 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
汽车运用工程毕业生自荐信
2013/10/29 职场文书
运动会致辞稿50字
2014/02/04 职场文书
军训考核自我鉴定
2014/02/13 职场文书
实习评语大全
2014/04/26 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
社区党支部承诺书
2015/04/29 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
我收到了德劲DE1107
2022/04/05 无线电