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.ini中文版(1)
Oct 09 PHP
php zlib压缩和解压缩swf文件的代码
Dec 30 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
Jun 24 PHP
基于php使用memcache存储session的详解
Jun 25 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
php生成xml时添加CDATA标签的方法
Oct 17 PHP
PHP静态文件生成类实例
Nov 29 PHP
php中删除、清空session的方式总结
Oct 09 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 PHP
PHP基于进程控制函数实现多线程
Dec 09 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中的正规表达式(二)
2006/10/09 PHP
一个PHP数组应该有多大的分析
2009/07/30 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
php简单日历函数
2015/10/28 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
Ajax+Jpgraph实现的动态折线图功能示例
2019/02/11 PHP
JavaScript创建对象的写法
2013/08/29 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Python Subprocess模块原理及实例
2019/08/26 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
在python shell中运行python文件的实现
2019/12/21 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
如何利用python 读取配置文件
2021/01/06 Python
python爬取youtube视频的示例代码
2021/03/03 Python
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
解决方案设计综合面试题
2015/08/31 面试题
导师推荐信范文
2014/05/09 职场文书
食品流通安全承诺书
2014/05/22 职场文书
2014年护理工作总结范文
2014/11/14 职场文书