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程序?
Dec 08 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
万能的php分页类
Jul 06 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
PHP7数组的底层实现示例
Aug 25 PHP
laravel 错误处理,接口错误返回json代码
Oct 25 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
phplot生成图片类用法详解
2015/01/06 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
js轮播图无缝滚动效果
2017/06/17 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
在Python中使用Neo4j数据库的教程
2015/04/16 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
对python sklearn one-hot编码详解
2018/07/10 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
户外宣传策划方案
2014/05/25 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
医德医风自我评价
2014/09/19 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
安全保证书格式
2015/02/28 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
商务宴会祝酒词
2015/08/11 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电