当前位置:首页 > PHP教程 > php高级应用 > 列表

php观察者模式应用场景实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2019-07-28 16:22:47 浏览: 评论:0 

这篇文章主要介绍了php观察者模式应用场景,结合完整实例形式详细分析了php观察者模式的具体定义与使用技巧,需要的朋友可以参考下。

本文实例讲述了php观察者模式的应用。分享给大家供大家参考,具体如下:

  1. <?php 
  2.  
  3. /** 
  4.  
  5.  * 观察者模式应用场景实例 
  6.  
  7.  * 
  8.  
  9.  * 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合。 
  10.  
  11.  * 
  12.  
  13.  * 场景描述: 
  14.  
  15.  * 哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如: 
  16.  
  17.  * 1、购票后记录文本日志 
  18.  
  19.  * 2、购票后记录数据库日志 
  20.  
  21.  * 3、购票后发送短信 
  22.  
  23.  * 4、购票送抵扣卷、兑换卷、积分 
  24.  
  25.  * 5、其他各类活动等 
  26.  
  27.  * 
  28.  
  29.  * 传统解决方案: 
  30.  
  31.  * 在购票逻辑等类内部增加相关代码,完成各种逻辑。 
  32.  
  33.  * 
  34.  
  35.  * 存在问题: 
  36.  
  37.  * 1、一旦某个业务逻辑发生改变,如购票业务中增加其他业务逻辑,需要修改购票核心文件、甚至购票流程。 
  38.  
  39.  * 2、日积月累后,文件冗长,导致后续维护困难。 
  40.  
  41.  * 
  42.  
  43.  * 存在问题原因主要是程序的"紧密耦合",使用观察模式将目前的业务逻辑优化成"松耦合",达到易维护、易修改的目的, 
  44.  
  45.  * 同时也符合面向接口编程的思想。 
  46.  
  47.  * 
  48.  
  49.  * 观察者模式典型实现方式: 
  50.  
  51.  * 1、定义2个接口:观察者(通知)接口、被观察者(主题)接口 
  52.  
  53.  * 2、定义2个类,观察者对象实现观察者接口、主题类实现被观者接口 
  54.  
  55.  * 3、主题类注册自己需要通知的观察者 
  56.  
  57.  * 4、主题类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。 
  58.  
  59.  * 
  60.  
  61.  * 示例:如以下代码 
  62.  
  63.  * 
  64.  
  65.  */ 
  66.  
  67.  date_default_timezone_set('PRC'); //设置中国时区 
  68.  
  69. #===================定义观察者、被观察者接口============ 
  70.  
  71. /** 
  72.  
  73.  * 
  74.  
  75.  * 观察者接口(通知接口) 
  76.  
  77.  * 
  78.  
  79.  */ 
  80.  
  81. interface ITicketObserver //观察者接口 
  82.  
  83.  
  84.   function onBuyTicketOver($sender$args); //得到通知后调用的方法 
  85.  
  86.  
  87. /** 
  88.  
  89.  * 
  90.  
  91.  * 主题接口 
  92.  
  93.  * 
  94.  
  95.  */ 
  96.  
  97. interface ITicketObservable //被观察对象接口 
  98.  
  99.  
  100.   function addObserver($observer); //提供注册观察者方法 
  101.  
  102.  
  103. #====================主题类实现======================== 
  104.  
  105. /** 
  106.  
  107.  * 
  108.  
  109.  * 主题类(购票) 
  110.  
  111.  * 
  112.  
  113.  */ 
  114.  
  115. class HipiaoBuy implements ITicketObservable { //实现主题接口(被观察者) 
  116.  
  117.   private $_observers = array (); //通知数组(观察者) 
  118.  
  119.   public function buyTicket($ticket//购票核心类,处理购票流程 
  120.  
  121.  
  122.     // TODO 购票逻辑 
  123.  
  124.     //循环通知,调用其onBuyTicketOver实现不同业务逻辑 
  125.  
  126.     foreach ( $this->_observers as $obs ) 
  127.  
  128.       $obs->onBuyTicketOver ( $this$ticket ); //$this 可用来获取主题类句柄,在通知中使用 
  129.  
  130.   } 
  131.  
  132.   //添加通知 
  133.  
  134.   public function addObserver($observer//添加N个通知 
  135.  
  136.  
  137.     $this->_observers [] = $observer
  138.  
  139.   } 
  140.  
  141.  
  142. #=========================定义多个通知==================== 
  143.  
  144. //短信日志通知 
  145.  
  146. class HipiaoMSM implements ITicketObserver { 
  147.  
  148.   public function onBuyTicketOver($sender$ticket) { 
  149.  
  150.     echo (date ( 'Y-m-d H:i:s' ) . " 短信日志记录:购票成功:$ticket<br>"); 
  151.  
  152.   } 
  153.  
  154.  
  155. //文本日志通知 
  156.  
  157. class HipiaoTxt implements ITicketObserver { 
  158.  
  159.   public function onBuyTicketOver($sender$ticket) { 
  160.  
  161.     echo (date ( 'Y-m-d H:i:s' ) . " 文本日志记录:购票成功:$ticket<br>"); 
  162.  
  163.   } 
  164.  
  165.  
  166. //抵扣卷赠送通知 
  167.  
  168. class HipiaoDiKou implements ITicketObserver { 
  169.  
  170.   public function onBuyTicketOver($sender$ticket) { 
  171.  
  172.     echo (date ( 'Y-m-d H:i:s' ) . " 赠送抵扣卷:购票成功:$ticket 赠送10元抵扣卷1张。<br>"); 
  173.  
  174.   } 
  175.  
  176.  
  177. #============================用户购票==================== 
  178.  
  179. $buy = new HipiaoBuy (); 
  180.  
  181. $buy->addObserver ( new HipiaoMSM () ); //根据不同业务逻辑加入各种通知 
  182.  
  183. $buy->addObserver ( new HipiaoTxt () ); 
  184.  
  185. $buy->addObserver ( new HipiaoDiKou () ); 
  186. //phpfensi.com 
  187. //购票 
  188.  
  189. $buy->buyTicket ( "一排一号" ); 
  190.  
  191. ?> 

运行结果如下:

2017-02-03 10:25:45 短信日志记录:购票成功:一排一号

2017-02-03 10:25:45 文本日志记录:购票成功:一排一号

2017-02-03 10:25:45 赠送抵扣卷:购票成功:一排一号 赠送10元抵扣卷1张。

Tags: php观察者 php模式应用

分享到: