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模拟SQL Server的两个日期处理函数
Oct 09 PHP
PHP中动态显示签名和ip原理
Mar 28 PHP
php daodb插入、更新与删除数据
Mar 19 PHP
PHP 字符串 小常识
Jun 05 PHP
JS 网站性能优化笔记
May 24 PHP
PHP三元运算符的结合性介绍
Jan 10 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
php面向对象重点知识分享
Sep 27 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
javascript整除实现代码
2010/11/23 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python中将一个全部为int的list 转化为str的list方法
2018/04/09 Python
查看Django和flask版本的方法
2018/05/14 Python
python实现批量注册网站用户的示例
2019/02/22 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
优秀毕业大学生推荐信
2013/11/13 职场文书
优秀求职信范文分享
2014/01/26 职场文书
护理中职生求职信范文
2014/02/24 职场文书
电子专业求职信
2014/06/19 职场文书
学风建设演讲稿
2014/09/12 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书