国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

php觀察者模式應(yīng)用場景實例詳解

2024-05-04 21:50:49
字體:
供稿:網(wǎng)友

這篇文章主要介紹了php觀察者模式應(yīng)用場景,結(jié)合完整實例形式詳細(xì)分析了php觀察者模式的具體定義與使用技巧,需要的朋友可以參考下。

本文實例講述了php觀察者模式的應(yīng)用。分享給大家供大家參考,具體如下:

  1. <?php 
  2.  
  3. /** 
  4.  
  5.  * 觀察者模式應(yīng)用場景實例 
  6.  
  7.  * 
  8.  
  9.  * 免責(zé)聲明:本文只是以哈票網(wǎng)舉例,示例中并未涉及哈票網(wǎng)任何業(yè)務(wù)代碼,全部原創(chuàng),如有雷同,純屬巧合。 
  10.  
  11.  * 
  12.  
  13.  * 場景描述: 
  14.  
  15.  * 哈票以購票為核心業(yè)務(wù)(此模式不限于該業(yè)務(wù)),但圍繞購票會產(chǎn)生不同的其他邏輯,如: 
  16.  
  17.  * 1、購票后記錄文本日志 
  18.  
  19.  * 2、購票后記錄數(shù)據(jù)庫日志 
  20.  
  21.  * 3、購票后發(fā)送短信 
  22.  
  23.  * 4、購票送抵扣卷、兌換卷、積分 
  24.  
  25.  * 5、其他各類活動等 
  26.  
  27.  * 
  28.  
  29.  * 傳統(tǒng)解決方案: 
  30.  
  31.  * 在購票邏輯等類內(nèi)部增加相關(guān)代碼,完成各種邏輯。 
  32.  
  33.  * 
  34.  
  35.  * 存在問題: 
  36.  
  37.  * 1、一旦某個業(yè)務(wù)邏輯發(fā)生改變,如購票業(yè)務(wù)中增加其他業(yè)務(wù)邏輯,需要修改購票核心文件、甚至購票流程。 
  38.  
  39.  * 2、日積月累后,文件冗長,導(dǎo)致后續(xù)維護困難。 
  40.  
  41.  * 
  42.  
  43.  * 存在問題原因主要是程序的"緊密耦合",使用觀察模式將目前的業(yè)務(wù)邏輯優(yōu)化成"松耦合",達到易維護、易修改的目的, 
  44.  
  45.  * 同時也符合面向接口編程的思想。 
  46.  
  47.  * 
  48.  
  49.  * 觀察者模式典型實現(xiàn)方式: 
  50.  
  51.  * 1、定義2個接口:觀察者(通知)接口、被觀察者(主題)接口 
  52.  
  53.  * 2、定義2個類,觀察者對象實現(xiàn)觀察者接口、主題類實現(xiàn)被觀者接口 
  54.  
  55.  * 3、主題類注冊自己需要通知的觀察者 
  56.  
  57.  * 4、主題類某個業(yè)務(wù)邏輯發(fā)生時通知觀察者對象,每個觀察者執(zhí)行自己的業(yè)務(wù)邏輯。 
  58.  
  59.  * 
  60.  
  61.  * 示例:如以下代碼 
  62.  
  63.  * 
  64.  
  65.  */ 
  66.  
  67.  date_default_timezone_set('PRC'); //設(shè)置中國時區(qū) 
  68.  
  69. #===================定義觀察者、被觀察者接口============ 
  70.  
  71. /** 
  72.  
  73.  * 
  74.  
  75.  * 觀察者接口(通知接口) 
  76.  
  77.  * 
  78.  
  79.  */ 
  80.  
  81. interface ITicketObserver //觀察者接口 
  82.  
  83.  
  84.   function onBuyTicketOver($sender$args); //得到通知后調(diào)用的方法 
  85.  
  86.  
  87. /** 
  88.  
  89.  * 
  90.  
  91.  * 主題接口 
  92.  
  93.  * 
  94.  
  95.  */ 
  96.  
  97. interface ITicketObservable //被觀察對象接口 
  98.  
  99.  
  100.   function addObserver($observer); //提供注冊觀察者方法 
  101.  
  102.  
  103. #====================主題類實現(xiàn)======================== 
  104.  
  105. /** 
  106.  
  107.  * 
  108.  
  109.  * 主題類(購票) 
  110.  
  111.  * 
  112.  
  113.  */ 
  114.  
  115. class HipiaoBuy implements ITicketObservable { //實現(xiàn)主題接口(被觀察者) 
  116.  
  117.   private $_observers = array (); //通知數(shù)組(觀察者) 
  118.  
  119.   public function buyTicket($ticket//購票核心類,處理購票流程 
  120.  
  121.  
  122.     // TODO 購票邏輯 
  123.  
  124.     //循環(huán)通知,調(diào)用其onBuyTicketOver實現(xiàn)不同業(yè)務(wù)邏輯 
  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 () ); //根據(jù)不同業(yè)務(wù)邏輯加入各種通知 
  182.  
  183. $buy->addObserver ( new HipiaoTxt () ); 
  184.  
  185. $buy->addObserver ( new HipiaoDiKou () ); 
  186. //Vevb.com 
  187. //購票 
  188.  
  189. $buy->buyTicket ( "一排一號" ); 
  190.  
  191. ?> 

運行結(jié)果如下:

2017-02-03 10:25:45 短信日志記錄:購票成功:一排一號

2017-02-03 10:25:45 文本日志記錄:購票成功:一排一號

2017-02-03 10:25:45 贈送抵扣卷:購票成功:一排一號 贈送10元抵扣卷1張。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 万载县| 大英县| 金沙县| 武平县| 吕梁市| 常山县| 普格县| 广元市| 德格县| 临夏县| 广河县| 商城县| 上思县| 托克逊县| 吴江市| 调兵山市| 南木林县| 鄱阳县| 德江县| 阜新市| 泾源县| 凤阳县| 厦门市| 商洛市| 武义县| 浦东新区| 平远县| 博白县| 政和县| 兰西县| 仙游县| 恭城| 洛扎县| 麻城市| 濮阳市| 朔州市| 景德镇市| 青川县| 凤山县| 惠州市| 邵阳县|