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实现二分查找算法代码分享
Jun 24 PHP
php中将网址转换为超链接的函数
Sep 02 PHP
php实现删除指定目录下相关文件的方法
Oct 20 PHP
PHP5.2下preg_replace函数的问题
May 08 PHP
PHP7.0版本备注
Jul 23 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
PHP如何读取由JavaScript设置的Cookie
Mar 22 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
May 20 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
Aug 30 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 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 is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python字典key不能是可以是啥类型
2020/08/04 Python
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
园林技术个人的自我评价
2014/02/15 职场文书
职务任命书范本
2014/06/05 职场文书
六年级学生期末评语
2014/12/26 职场文书
给老婆道歉的话
2015/01/20 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
会议新闻稿
2015/07/17 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
多人股份制合作协议书
2016/03/19 职场文书
2019新员工心得体会
2019/06/25 职场文书
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技