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调用三种数据库的方法(2)
Oct 09 PHP
snoopy 强大的PHP采集类使用实例代码
Dec 09 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
php中inlcude()性能对比详解
Sep 16 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
PHP截断标题且兼容utf8和gb2312编码
Sep 22 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
Dec 22 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
php插件Xajax使用方法详解
Aug 31 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代码
2010/07/17 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
Webpack之tree-starking 解析
2018/09/11 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python的类方法和静态方法
2014/12/13 Python
wxPython中listbox用法实例详解
2015/06/01 Python
简单了解什么是神经网络
2017/12/23 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
python中wx模块的具体使用方法
2020/05/15 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
全民健身日活动方案
2014/01/29 职场文书
四下基层实施方案
2014/03/28 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书