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 相关文章推荐
Wordpress php 分页代码
Oct 21 PHP
PHP 引用是个坏习惯
Mar 12 PHP
让PHP支持断点续传的源码
May 16 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
PHP向浏览器输出内容的4个函数总结
Nov 17 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
Apr 12 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
PHP+Ajax实现的博客文章添加类别功能示例
Mar 29 PHP
php中上传文件的的解决方案
Sep 25 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
微信JSSDK分享功能图文实例详解
Apr 08 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常用正则表达式集锦
2014/08/17 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
CI框架简单分页类用法示例
2020/06/06 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
在Python下进行UDP网络编程的教程
2015/04/29 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
python实现自动发送邮件
2018/06/20 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
小学教师自我鉴定
2013/11/07 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
实践单位评语
2014/04/26 职场文书
医院标语大全
2014/06/23 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang