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 相关文章推荐
模拟flock实现文件锁定
Feb 14 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
初识php MVC
Sep 10 PHP
PHP中常用的输出函数总结
Sep 22 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
Symfony2 session用法实例分析
Feb 04 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
php post换行的方法
Feb 03 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
dedecms系统常用术语汇总
2007/04/03 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
PHP生成随机密码类分享
2014/06/25 PHP
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
简单的编程0基础下Python入门指引
2015/04/01 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
python中的print()输出
2019/04/12 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
电大自我鉴定范文
2013/10/01 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
家长给学校的建议书
2014/05/15 职场文书
分公司任命书
2014/06/06 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
结婚老公保证书
2015/02/26 职场文书
个人借条范本
2015/05/25 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
关于的python五子棋的算法
2022/05/02 Python