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 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
解析htaccess伪静态的规则
Jun 18 PHP
php while循环得到循环次数
Oct 26 PHP
PHP中使用memcache存储session的三种配置方法
Apr 05 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
PHP封装的完整分页类示例
Aug 21 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
第八节 访问方式 [8]
2006/10/09 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
php UBB 解析实现代码
2011/11/27 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
Python实现全角半角字符互转的方法
2016/11/28 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
python实现的汉诺塔算法示例
2019/10/23 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
python3实现简单飞机大战
2020/11/29 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
车间调度岗位职责
2013/11/30 职场文书
文明班级申报材料
2014/12/24 职场文书
地方课程教学计划
2015/01/19 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫