摘要:什么是觀察者模式觀察者模式用于實現對對象進行觀察一旦主體對象狀態發生改變,與之關聯的觀察者對象會收到通知,并進行相應操作。應用觀察者模式的好處觀察者模式解除了主體和具體觀察者的耦合,讓耦合的雙方都依賴于抽象,而不是依賴具體。
什么是觀察者模式
觀察者模式用于實現對對象進行觀察:一旦主體對象狀態發生改變,與之關聯的觀察者對象會收到通知,并進行相應操作。
舉個例子說明:
假設一個這樣的情景,當公司有一個新員工入職了,入職的當天,HR需要為他辦理入職手續,網管需要給他配好電腦和辦公用品,部門主管需要帶他熟悉部門。傳統的編程方式,就是在員工入職這個事件發生的代碼之后直接加入處理邏輯,當后續我們需要增加處理邏輯時(比如員工入職后增加培訓),代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要改變事件主題的代碼。運用觀察者模式,將員工的入職作為事件,其他的處理邏輯都做為觀察者的操作,那么,當以后需要再增加更多的邏輯時,新增邏輯代碼就會很方便。具體代碼實現如下。
首先定義一個觀察者接口,所有的觀察者都實現這個接口(為什么要定義成接口呢?因為每一個觀察者的具體行為需要具體去實現,用接口定義一個統一的方法,具體的實現交給觀察者去實現)
interface observer { public function update(); }
再定義一個事件生成器的抽象類,用來使繼承它的事件都具有通知觀察者的能力。
abstract class EventGenerator { private $observers = []; //定義一個添加觀察者的方法 public function addOberver(Observer $observer) { $this->observers[] = $observer; } //定義一個通知觀察者的方法 public function notify() { foreach($this->observers as $observer) { $observer->update(); } } }
然后再來定義事件類
class event extends EventGenerator { //定義一個觸發觀察者的方法 public funtion trigger() { echo "Event
"; //開始通知觀察者 $this->notify(); } }
開始使用
$event = new event(); $event->trigger();
這個時候,當我們要在事件發生的時候增加別的操作,只需要新增觀察者就可以了
新增一個觀察者
class Observer1 implements Observer { public function update() { echo "操作1
"; } }
然后使用的時候就是
$event = new event(); // 增加觀察者 $event->addObserver(new Observer1); $event->trigger();
如果需要在事件發生后再增加操作,只需再新增相應的觀察者即可。
應用觀察者模式的好處觀察者模式解除了主體和具體觀察者的耦合,讓耦合的雙方都依賴于抽象,而不是依賴具體。從而使得各自的變化都不會影響另一邊的變化。降低對象之間的耦合度以達到解耦的目的,符合"開閉原則"的要求。
利用 SPL 實現觀察者模式PHP 通過內置的 SPL 擴展提供了對觀察者模式的原生支持,其中的觀察者由 3 個元素組成 : SplObserver 接口、 SplSubject 接口和 SplObjectStorage 工具類。下面是利用 SPL 實現觀察者模式的代碼。SPL 的地址見這里。
class MyObserver1 implements SplObserver { public function update(SplSubject $subject) { echo __CLASS__ . " - " . $subject->getName(); } } class MyObserver2 implements SplObserver { public function update(SplSubject $subject) { echo __CLASS__ . " - " . $subject->getName(); } } class MySubject implements SplSubject { private $observers; private $name; public function __construct($name) { $this->observers = new SplObjectStorage(); $this->name = $name; } public function attach(SplObserver $observer) { $this->observers->attach($observer); } public function detach(SplObserver $observer) { $this->observers->detach($observer); } public function notify() { foreach ($this->observers as $observer) { $observer->update($this); } } public function getName() { return $this->name; } } $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 */
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26164.html
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章觀察者模式概述課程簡介觀察者模式的定義定義對象間的一種一對多的依賴關系。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/z...
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
摘要:想繼續了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。創建型設計模式主要有簡單工廠模式,工廠方法模式,抽象工廠模式,建造者模式,原型模式和單例模式,下面一一道來。而工廠方法模式本意是將實際創建對象的工作推遲到子類中。 接觸前端兩三個月的時候,那時候只是聽說設計模式很重要,然后我就去讀了一本設計模式的書,讀了一部分,也不知道這些設計模式到底設計出來干嘛的,然后就沒再看了。后...
摘要:我們可以把取消發貨單和取消訂單看成一個被觀察或被訂閱的類實例的對象,一旦發生取消行為,我們立即通知各個觀察者做出相對應的行為。裝飾器模式裝飾器思想,不管以前業務邏輯,甚至不去讀,調用之前的接口裝飾上新的數據,達到自己的目的。 前言 還是每月的目標至少寫一篇文章,一晃八月份就要過去了,這個月依然沒有什么產出,毫無疑問最近的狀態就是不停的工作,不停的加班。所以還是把最近工作進行一個總結,首...
閱讀 2097·2023-04-26 00:09
閱讀 3115·2021-09-26 10:12
閱讀 3481·2019-08-30 15:44
閱讀 2863·2019-08-30 13:47
閱讀 922·2019-08-23 17:56
閱讀 3226·2019-08-23 15:31
閱讀 475·2019-08-23 13:47
閱讀 2508·2019-08-23 11:56