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的FTP学习(三)
Oct 09 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
一个简单的PHP验证码实现代码
May 10 PHP
神盾加密解密教程(三)PHP 神盾解密工具
Jun 08 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
PHP实现GIF图片验证码
Nov 04 PHP
php实现的递归提成方案实例
Nov 14 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 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句法规则详解 入门学习
2011/11/09 PHP
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
基于node.js的快速开发透明代理
2010/12/25 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
python 实现二维列表转置
2019/12/02 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
公司离职证明范本
2014/01/13 职场文书
2015年档案室工作总结
2015/05/23 职场文书
付款证明格式范文
2015/06/19 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
实验室安全管理制度
2015/08/05 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
怎么用Python识别手势数字
2021/06/07 Python
Go语言基础函数基本用法及示例详解
2021/11/17 Golang
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技