1. 程式人生 > >Php設計模式:行為型模式(二)

Php設計模式:行為型模式(二)

可以線上執行檢視效果哦!    

<接上一篇>

4、觀察者模式(Observer):

         又叫釋出訂閱模式,當一個主體物件發生改變時,依賴它的多個觀察者物件都得到通知並自動更新響應。就像報社一樣,今天釋出的訊息只要是看這份報紙的人看到的都是同樣的內容。如果釋出另一份報紙,也是一樣的。

         好處:廣播式通訊,範圍大,一呼百應,便於操作一個組團,“公有制”。

         弊端:不能單獨操作組團裡的個體,不能實行按需分配。

         應用場景:操作多個物件,並操作相同。

程式碼實現:

  1. <?php  
  2. /** 
  3.  * 優才網公開課示例程式碼
     
  4.  * 
  5.  * 觀察者模式 Observer 
  6.  * 
  7.  * @author 優才網全棧工程師教研組 
  8.  * @see http://www.ucai.cn 
  9.  */
  10. function output($string) {  
  11.     echo$string . "\n";  
  12. }  
  13. //訂單資料物件簡單模擬,這個是實際需要被觀察的物件(Subject),但是我們將其獨立,然後
  14. //通過構造方法傳入到我們模式中的Subject中,這樣使具體業務更加獨立
  15. class Order{  
  16.     //訂單號
  17.     private$id = '';  
  18.     //使用者ID
  19.     private$userId
     = '';  
  20.     //使用者名稱
  21.     private$userName = '';  
  22.     //價格
  23.     private$price = '';  
  24.     //下單時間
  25.     private$orderTime = '';  
  26.     //訂單資料填充簡單模擬,實際應用中可能會讀取使用者表單輸入並處理
  27.     publicfunction __set($name$value){  
  28.         if (isset($this->$name)){  
  29.             $this->$name = $value;  
  30.         }  
  31.     }  
  32.     //獲取訂單屬性
  33.     publicfunction __get($name){  
  34.         if (isset($this->$name)){  
  35.             return$this->$name;  
  36.         }  
  37.         return"";  
  38.     }  
  39. }  
  40. //假設的DB類,便於測試,實際會存入真實資料庫
  41. class FakeDB{  
  42.     publicfunction save($data){  
  43.         return true;  
  44.     }  
  45. }  
  46. class Client {  
  47.     publicstaticfunction test() {  
  48.         //初始化一個訂單資料
  49.         $order = new Order();  
  50.         $order->id = 1001;  
  51.         $order->userId = 9527;  
  52.         $order->userName = "God";  
  53.         $order->price = 20.0;  
  54.         $order->orderTime = time();  
  55.         //向資料庫儲存訂單
  56.         $db = new FakeDB();  
  57.         $result = $db->save($order);  
  58.         if ($result){  
  59.             //實際應用可能會寫到日誌檔案中,這裡直接輸出
  60.             output( "[OrderId:{$order->id}] [UseId:{$order->userId}] [Price:{$order->price}]" );  
  61.             //實際應用會呼叫郵件傳送服務如sendmail,這裡直接輸出
  62.             output( "Dear {$order->userName}: Your order {$order->id} was confirmed!" );  
  63.             //實際應用會呼叫郵件傳送服務如sendmail,這裡直接輸出
  64.             output( "Dear Manager: User {$order->userName}(ID:{$order->userId}) submitted a new order {$order->id}, please handle it ASAP!" );  
  65.         }  
  66.     }  
  67. }  
  68. Client::test();  
  69. <?php  
  70. /** 
  71.  * 優才網公開課示例程式碼 
  72.  * 
  73.  * 觀察者模式 Observer 
  74.  * 
  75.  * @author 優才網全棧工程師教研組 
  76.  * @see http://www.ucai.cn 
  77.  */
  78. function output($string) {  
  79.     echo$string . "\n";  
  80. }  
  81. //訂單資料物件簡單模擬,這個是實際需要被觀察的物件(Subject),但是我們將其獨立,然後
  82. //通過構造方法傳入到我們模式中的Subject中,這樣使具體業務更加獨立
  83. class Order{  
  84.     //訂單號
  85.     private$id = '';  
  86.     //使用者ID
  87.     private$userId = '';  
  88.     //使用者名稱
  89.     private$userName = '';  
  90.     //價格
  91.     private$price = '';  
  92.     //下單時間
  93.     private$orderTime = '';  
  94.     //訂單資料填充簡單模擬,實際應用中可能會讀取使用者表單輸入並處理
  95.     publicfunction __set($name$value){  
  96.         if (isset($this->$name)){  
  97.             $this->$name = $value;  
  98.         }  
  99.     }  
  100.     //獲取訂單屬性
  101.     publicfunction __get($name){  
  102.         if (isset($this->$name)){  
  103.             return$this->$name;  
  104.         }  
  105.         return"";  
  106.     }  
  107. }  
  108. //被觀察者, 負責維護觀察者並在變化發生是通知觀察者
  109. class OrderSubject implements SplSubject {  
  110.     private$observers;  
  111.     private$order;  
  112.     publicfunction __construct(Order $order) {  
  113.         $this->observers = new SplObjectStorage();  
  114.         $this->order = $order;  
  115.     }  
  116.     //增加一個觀察者
  117.     publicfunction attach(SplObserver $observer) {  
  118.         $this->observers->attach($observer);  
  119.     }  
  120.     //移除一個觀察者
  121.     publicfunction detach(SplObserver $observer) {  
  122.         $this->observers->detach($observer);  
  123.     }  
  124.     //通知所有觀察者
  125.     publicfunction notify() {  
  126.         foreach ($this->observers as$observer) {  
  127.             $observer->update($this);  
  128.         }  
  129.     }  
  130.     //返回主體物件的具體實現,供觀察者呼叫
  131.     publicfunction getOrder() {  
  132.         return$this->order;  
  133.     }  
  134. }  
  135. //記錄業務資料日誌 (ActionLogObserver),實際可能還要抽象一層以處理不同的Action(業務操作),這裡省略
  136. class ActionLogObserver implements SplObserver{  
  137.     publicfunction update(SplSubject $subject) {  
  138.          $order = $subject->getOrder();  
  139.          //實際應用可能會寫到日誌檔案中,這裡直接輸出
  140. 相關推薦

    Php設計模式行為模式

    可以線上執行檢視效果哦!     <接上一篇> 4、觀察者模式(Observer):          又叫釋出訂閱模式,當一個主體物件發生改變時,依賴它的多個觀察者物件都得到通知並自動更新響應。就像報社一樣,今天釋出的訊息只要是看這份報紙的人看到的都是同樣的內容。如果釋出另一份報紙,也是一

    js的36個設計模式行為模式

    1.模板方法模式 不太好描述,就類似封裝一個外掛,傳入不同引數和函式,實現新增dom的樣式和方法。 2.觀察者模式 跳過 3.狀態模式 把多個判斷封裝到函式內。 var a = "run"; function action(a){

    Java設計模式簡介行為模式

    其實每個設計模式都是很重要的一種思想,看上去很熟,其實是因為我們在學到的東西中都有涉及,儘管有時我們並不知道,其實在Java本身的設計之中處處都有體現,像AWT、JDBC、集合類、IO管道或者是Web框架,裡面設計模式無處不在。因為我們篇幅有限,很難講每一個設計模式都講的很詳細。 本章講講

    Java設計模式簡介行為模式

    本章講到第三種設計模式——行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 先來張圖,看看這11中模式的關係: 第一類:通過父類與子類的關係進行實現。第二類:兩個類之間。第三類:類的狀態。第

    人人都能讀懂的設計模式3行為模式

    用最簡單的語言,解釋設計模式。 雖然示例程式碼是用 PHP7 實現的,但因為概念是一樣的,所以語言並不會阻礙大家理解設計模式。 概述 行為型設計模式關心物件之間的責任分配。與結構型設計模式不同的是,行為型設計模式不僅僅指定結構,而且還概述了它們之間的訊息傳遞/通訊

    初探Java設計模式3行為模式策略,觀察者等

    轉自https://javadoop.com/post/design-pattern行為型模式行為型模式行為型模式關注的是各個類之間的相互作用,將職責劃分清楚,使得我們的程式碼更加地清晰。策略模式策略模式太常用了,所以把它放到最前面進行介紹。它比較簡單,我就不廢話,直接用程式

    設計模式彙總結構模型

    總體來說設計模式分為三大類: 建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享

    【大話設計模式】——行為模式總結一對多

        根據上上一篇部落格的分類,這篇部落格總結一下有一對多關係的模式:職責鏈,中介者,觀察者,迭代器。其實這幾個模式沒什麼大關係,也沒什麼可以比較的,硬是讓我把它們放在了一起。 一、職責鏈(Cha

    GoF23種設計模式行為模式之訪問者模式

    部分 strong 操作 定義 狀態 arraylist his tro 不同的 概述 表示一個作用於某對象結構中的各元素的操作。 它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。 適用性 1.一個對象結構包含很多

    GoF23種設計模式行為模式之模板方法

    title 開始 gof prim void strong 結構 currency 類圖 概述 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。 TemplateMethod使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

    設計模式(32)-----行為模式-----空物件設計模式

    在空物件模式(Null Object Pattern)中,一個空物件取代 NULL 物件例項的檢查。Null 物件不是檢查空值,而是反應一個不做任何動作的關係。這樣的 Null 物件也可以在資料不可用的時候提供預設的行為。 在空物件模式中,我們建立一個指定各種要執行的操作的抽象類和擴充套件該類的實體類,還建

    設計模式(33)-----行為模式-----訪問者設計模式

    訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。   介紹 意圖:主要將資

    設計模式結構模式

      外觀模式:為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層介面,這個介面使得這一系統更加容易使用。 介面卡模式:將一個類的介面轉換成客戶希望的另外一個介面。它使得原本由於介面不相容而不能一起工作的那些類一起工作。 橋接模式:將抽象部分與它的實現部分分離,使它們可以獨立地變化。

    設計模式(14)-行為模式-command模式

    別名:Action或者Transaction 1.1.1      功能                 Command模式通過將請求封裝到一個物件(Command)中,並將請求的接受者(Receiver)存放到具體的ConcreteCommand類中中,從而實現呼叫操作的

    Java經典23種設計模式行為模式(一)

    行為型設計模式有11種,分別是Chain of Responsibility ( 責任鏈模式 )、Command ( 命令模式 )、Interpreter ( 直譯器模式 ) 、Iterator ( 迭代器模式 )、Mediator ( 中介者模式 ) 、Memento (

    設計模式(17)-行為模式-Moderator模式

    3.5           Moderator模式 3.5.1      功能 可以通過將集體行為封裝在一個單獨的mediator當中來避免不同元件(物件)之間的依賴關係。Mediator負責控制盒協調一組物件間的互動。Mediator是的組中的物件不再相互顯式的呼叫。 3

    設計模式(23)-行為模式-VISITOR模式

    3.11.1功能 在面向物件系統的開發和設計過程,經常會遇到一種情況就是需求變更(ChangeRequest),經常我們做好的一個設計、實現了一個系統原型,咱們的客戶又會有了新的需求。我們又因此不得不去修改已有的設計,最常見就是解決方案就是給已經設計、實現好的類新增新的方法

    設計模式(22)-行為模式-Template Method模式

    功能                 在面向物件系統的分析與設計過程中經常會遇到這樣一種情況:對於某一個業務邏輯(演算法實現)在不同的物件中有不同的細節實現,但是邏輯(演算法)的框架(或通用的應用演算法)是相同的。Template提供了這種情況的一個實現框架。       

    js的36個設計模式技巧模式

    1.鏈模式 通過return this,讓函式物件可以鏈式呼叫。 function fn(){ this.a = function(){ console.log("a")

    建立工廠:抽象工廠模式

    抽象工廠模式 抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最