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 相关文章推荐
PHP4实际应用经验篇(4)
Oct 09 PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
php MessagePack介绍
Oct 06 PHP
php实现天干地支计算器示例
Mar 14 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
php实现简单的上传进度条
Nov 17 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
PHP中递归的实现实例详解
Nov 14 PHP
YII2框架使用控制台命令的方法分析
Mar 18 PHP
PHP控制循环操作的时间
Apr 01 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中改变图片的尺寸大小的代码
2011/07/17 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
python中cPickle用法例子分享
2014/01/03 Python
pyqt和pyside开发图形化界面
2014/01/22 Python
利用python发送和接收邮件
2016/09/27 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
动物学专业毕业生求职信
2013/10/11 职场文书
商场中秋节活动方案
2014/02/07 职场文书
消防先进事迹材料
2014/02/10 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
委托书怎样写
2014/08/30 职场文书
八一建军节演讲稿
2014/09/10 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
预备党员个人总结
2015/02/14 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
Python基础知识之变量的详解
2021/04/14 Python
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技