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安装为Apache DSO
Oct 09 PHP
PHP strtok()函数的优点分析
Mar 02 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
php跨服务器访问方法小结
May 12 PHP
php实现面包屑导航例子分享
Dec 19 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
PHP实现微信对账单处理
Oct 01 PHP
php集成开发环境详解
Sep 24 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
浅谈Laravel中使用Slack进行异常通知
May 29 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和ACCESS写聊天室(七)
2006/10/09 PHP
浅析PHP绘图技术
2013/07/03 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
python对于requests的封装方法详解
2019/01/03 Python
Python数据类型之List列表实例详解
2019/05/08 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
电子专业求职信
2014/06/19 职场文书
经典团队口号大全
2014/06/21 职场文书
节能环保演讲稿
2014/08/28 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
导游词之上海豫园
2019/10/24 职场文书
python 实现德洛内三角剖分的操作
2021/04/22 Python
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL