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开发文件系统实例讲解
Oct 09 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
PHP学习笔记之一
Jan 17 PHP
php入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
yii2 页面底部加载css和js的技巧
Apr 21 PHP
PHP实现一个简单url路由功能实例
Nov 05 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
php使用QueryList轻松采集js动态渲染页面方法
Sep 11 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
Sep 26 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下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
.net C#面试题
2012/08/28 面试题
小学教师个人先进事迹材料
2014/05/17 职场文书
中国梦读书活动总结
2014/07/10 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
JavaScript中isPrototypeOf函数
2021/11/07 Javascript
Python之matplotlib绘制饼图
2022/04/13 Python
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android