觀察者模式用於實現對物件進行觀察:一旦主體物件狀態發生改變,與之關聯的觀察者物件會收到通知,並進行相應操作。
舉個例子說明:
假設乙個這樣的情景,當公司有乙個新員工入職了,入職的當天,hr需要為他辦理入職手續,網管需要給他配好電腦和辦公用品,部門主管需要帶他熟悉部門。傳統的程式設計方式,就是在員工入職這個事件發生的**之後直接加入處理邏輯,當後續我們需要增加處理邏輯時(比如員工入職後增加培訓),**會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要改變事件主題的**。運用觀察者模式,將員工的入職作為事件,其他的處理邏輯都做為觀察者的操作,那麼,當以後需要再增加更多的邏輯時,新增邏輯**就會很方便。具體**實現如下。
首先定義乙個觀察者介面,所有的觀察者都實現這個介面(為什麼要定義成介面呢?因為每乙個觀察者的具體行為需要具體去實現,用介面定義乙個統一的方法,具體的實現交給觀察者去實現)
inte***ce observer
再定義乙個事件生成器的抽象類,用來使繼承它的事件都具有通知觀察者的能力。
abstract class eventgenerator
//定義乙個通知觀察者的方法
public function notify()
}}
然後再來定義事件類
class event extends eventgenerator
}
開始使用
$event = new event();
$event->trigger();
這個時候,當我們要在事件發生的時候增加別的操作,只需要新增觀察者就可以了
新增乙個觀察者
class observer1 implements observer
}
然後使用的時候就是
$event = new event();
// 增加觀察者
$event->addobserver(new observer1);
$event->trigger();
如果需要在事件發生後再增加操作,只需再新增相應的觀察者即可。
觀察者模式解除了主體和具體觀察者的耦合,讓耦合的雙方都依賴於抽象,而不是依賴具體。從而使得各自的變化都不會影響另一邊的變化。降低物件之間的耦合度以達到解耦的目的,符合"開閉原則"的要求。
php 通過內建的 spl 擴充套件提供了對觀察者模式的原生支援,其中的觀察者由 3 個元素組成 : splobserver 介面、 splsubject 介面和 splobjectstorage 工具類。下面是利用 spl 實現觀察者模式的**。spl 的位址見這裡。
class myobserver1 implements splobserver
}class myobserver2 implements splobserver
}class mysubject implements splsubject
public function attach(splobserver $observer)
public function detach(splobserver $observer)
public function notify()
}public function getname()
}$observer1 = new myobserver1();
$observer2 = new myobserver2();
$subject = new mysubject("test");
$subject->attach($observer1);
$subject->attach($observer2);
$subject->notify();
/* 輸出:
myobserver1 - test
myobserver2 - test
*/$subject->detach($observer2);
$subject->notify();
/* 輸出:
myobserver1 - test
*/
觀察者模式的總結
什麼是觀察者模式呢?觀察者模式最常用的地方是gui系統 訂閱 發布系統。他在開發中使用率還是非常高的,因為這個模式最重要的乙個作用就是解耦,將觀察者和被觀察者解耦,使得它們之間依賴性更小。還是上 吧 public class coder implements observer override pu...
觀察者模式簡單總結
觀察者模式就是兩個類的使用 public inte ce observer public class observable就像我們平時寫監聽一樣,不過這次是把listener加入集合中使用。public class aa public void notifyobservers public inte...
設計模式總結 觀察者模式
做開發這麼長時間了,設計模式用的真是不多,最近閒下來再看一遍設計模式,結合著開發經驗應該可以更深層次的理解了 觀察者模式適用於對於同一批資料需要多種展現形式的需求,也就是物件一對多的依賴形式,以head first中案例 我們有乙個氣象局,裡面有溫度,濕度,氣壓等指標,現在我們需要三種不同的展現形式...