php观察者模式应用场景实例详解


Posted in PHP onFebruary 03, 2017

本文实例讲述了php观察者模式的应用。分享给大家供大家参考,具体如下:

<?php
/**
 * 观察者模式应用场景实例
 *
 * 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合。
 *
 * 场景描述:
 * 哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如:
 * 1、购票后记录文本日志
 * 2、购票后记录数据库日志
 * 3、购票后发送短信
 * 4、购票送抵扣卷、兑换卷、积分
 * 5、其他各类活动等
 *
 * 传统解决方案:
 * 在购票逻辑等类内部增加相关代码,完成各种逻辑。
 *
 * 存在问题:
 * 1、一旦某个业务逻辑发生改变,如购票业务中增加其他业务逻辑,需要修改购票核心文件、甚至购票流程。
 * 2、日积月累后,文件冗长,导致后续维护困难。
 *
 * 存在问题原因主要是程序的"紧密耦合",使用观察模式将目前的业务逻辑优化成"松耦合",达到易维护、易修改的目的,
 * 同时也符合面向接口编程的思想。
 *
 * 观察者模式典型实现方式:
 * 1、定义2个接口:观察者(通知)接口、被观察者(主题)接口
 * 2、定义2个类,观察者对象实现观察者接口、主题类实现被观者接口
 * 3、主题类注册自己需要通知的观察者
 * 4、主题类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。
 *
 * 示例:如以下代码
 *
 */
 date_default_timezone_set('PRC'); //设置中国时区
#===================定义观察者、被观察者接口============
/**
 *
 * 观察者接口(通知接口)
 *
 */
interface ITicketObserver //观察者接口
{
  function onBuyTicketOver($sender, $args); //得到通知后调用的方法
}
/**
 *
 * 主题接口
 *
 */
interface ITicketObservable //被观察对象接口
{
  function addObserver($observer); //提供注册观察者方法
}
#====================主题类实现========================
/**
 *
 * 主题类(购票)
 *
 */
class HipiaoBuy implements ITicketObservable { //实现主题接口(被观察者)
  private $_observers = array (); //通知数组(观察者)
  public function buyTicket($ticket) //购票核心类,处理购票流程
{
    // TODO 购票逻辑
    //循环通知,调用其onBuyTicketOver实现不同业务逻辑
    foreach ( $this->_observers as $obs )
      $obs->onBuyTicketOver ( $this, $ticket ); //$this 可用来获取主题类句柄,在通知中使用
  }
  //添加通知
  public function addObserver($observer) //添加N个通知
{
    $this->_observers [] = $observer;
  }
}
#=========================定义多个通知====================
//短信日志通知
class HipiaoMSM implements ITicketObserver {
  public function onBuyTicketOver($sender, $ticket) {
    echo (date ( 'Y-m-d H:i:s' ) . " 短信日志记录:购票成功:$ticket<br>");
  }
}
//文本日志通知
class HipiaoTxt implements ITicketObserver {
  public function onBuyTicketOver($sender, $ticket) {
    echo (date ( 'Y-m-d H:i:s' ) . " 文本日志记录:购票成功:$ticket<br>");
  }
}
//抵扣卷赠送通知
class HipiaoDiKou implements ITicketObserver {
  public function onBuyTicketOver($sender, $ticket) {
    echo (date ( 'Y-m-d H:i:s' ) . " 赠送抵扣卷:购票成功:$ticket 赠送10元抵扣卷1张。<br>");
  }
}
#============================用户购票====================
$buy = new HipiaoBuy ();
$buy->addObserver ( new HipiaoMSM () ); //根据不同业务逻辑加入各种通知
$buy->addObserver ( new HipiaoTxt () );
$buy->addObserver ( new HipiaoDiKou () );
//购票
$buy->buyTicket ( "一排一号" );
?>

运行结果如下:

2017-02-03 10:25:45 短信日志记录:购票成功:一排一号
2017-02-03 10:25:45 文本日志记录:购票成功:一排一号
2017-02-03 10:25:45 赠送抵扣卷:购票成功:一排一号 赠送10元抵扣卷1张。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
新版PHP极大的增强功能和性能
Oct 09 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
PHP网站备份程序代码分享
Jun 10 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
深入解析php之sphinx
May 15 PHP
PHP中数组定义的几种方法
Sep 01 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 PHP
php上传图片获取路径及给表单字段赋值的方法
Jan 23 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
php修改数组键名的方法示例
Apr 15 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 #PHP
php使用curl代理实现抓取数据的方法
Feb 03 #PHP
php实现xml转换数组的方法示例
Feb 03 #PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 #PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 #PHP
php使用自定义函数实现汉字分割替换功能示例
Jan 30 #PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 #PHP
You might like
PHP版自动生成文章摘要
2008/07/23 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
Python实现KNN邻近算法
2021/01/28 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
Python制作exe文件简单流程
2019/01/24 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
Python中dict和set的用法讲解
2019/03/28 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
详解Django 时间与时区设置问题
2019/07/23 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
python 进程池pool使用详解
2020/10/15 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
几个常见的软件测试问题
2016/09/07 面试题
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
同事去世追悼词
2015/06/23 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python