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 相关文章推荐
[FAQ]PHP中的一些常识:类篇
Oct 09 PHP
PHP4实际应用经验篇(2)
Oct 09 PHP
NOT NULL 和NULL
Jan 15 PHP
也谈php网站在线人数统计
Apr 09 PHP
php socket方式提交的post详解
Jul 19 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
php编写简单的文章发布程序
Jun 18 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
如何使用php等比例缩放图片
Oct 12 PHP
PHP实现一个简单url路由功能实例
Nov 05 PHP
php app支付宝回调(异步通知)详解
Jul 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
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python栈类实例分析
2015/06/15 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
利用Python实现kNN算法的代码
2019/08/16 Python
Python装饰器用法与知识点小结
2020/03/09 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
家长给小学生的评语
2014/01/30 职场文书
酒店端午节促销方案
2014/02/18 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
团组织推荐意见
2015/06/05 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书