做專案過程中經常會遇到一種情況,寫乙個登陸介面,寫完後客戶有新需求需要增加統計登陸次數,過段時間又需要統計登陸地區,又過幾天又需要登陸推送活動或者新使用者獎勵,這種情況就容易讓**很雜亂,此時就可以用到觀察者模式。
概念:觀察者,首先要有個被人觀察的角色,這是唯一的,然後有多個觀察者去看他,可以形容為一群人在圍觀乙個人,有多個觀眾就得有個東西來記錄這些觀眾,這時候就需要乙個陣列來儲存所有觀察者,此時已經形成乙個被觀察者,多個觀察者和乙個容器記錄組成的乙個組合。
**示例:
//主題介面
inte***ce subject
//觀察者介面
inte***ce observer
subject是被觀察者,observer是觀察者
//被觀察者
class action implements subject
public function notify() }}
action 實現被觀察者介面,他現在是被觀察者,再定義乙個$_observers陣列,他就是存放觀察者的容器。
首先實現register方法,用它傳入乙個觀察者,然後塞到陣列裡,再實現notify()方法,他會遍歷容器陣列,執行每個觀察者的watch()方法。
觀察者
class cat implements observer
}class people implements observer
}
這裡定義了兩個觀察者,全都實現observer介面,前面的subject會迴圈呼叫每個觀察者的watch方法,所以需要實現每個觀察者的watch方法
應用例項
$action = new action();
$action->register(new cat());
$action->register(new people());
$action->notify();
首先new被觀察者物件,執行它的register()方法,把每個觀察者都放入容器陣列,最後執行notify防範,通知所有觀察者執行自己的方法。
php原生自帶的觀察者模式
splsubject 介面 - 被觀察者
observer介面 - 觀察者
splobjectstorage物件 - 容器
首先需要乙個使用者登入類
class user
}
然後讓他實現 splsubject 介面成為被觀察者。
1.首先在建構函式裡,讓他new splobjectstorage()物件並賦值到屬性上方便後邊呼叫
2.實現attach()方法,用來註冊觀察者
3.實現detach()方法,用來刪除觀察者
4.實現notify()方法,用來遍歷容器,呼叫每個觀察者的update方法(必須是update)
5.rewind方法是容器指標重置到最開始,valid方法檢測容器是否遍歷完成並返回布林,current方法獲取當前的觀察者,next方法是將指標後移以為
6.修改login()方法,在裡邊呼叫notify()來通知觀察者事件完成
**:
class user implements splsubject
public function login()
public function attach($observer)
public function detach($observer)
public function notify()}}
觀察者
每個觀察者實現splobserver介面,並實現update() 方法
class cat implements splobserver
}class people implements splobserver
}
應用
//實時觀察
$user = new user();
$user->attach(new cat());
$user->attach(new people());
$user->login();
關於php觀察者設計模式的解釋講到這裡也已經講完了,這些是我們在實際的專案開發當中遇到問題以及解決方案,以後我們也會定期在這裡分享這些內容;
PHP 觀察者模式
觀察者模式 定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並自動重新整理 能夠便利地建立檢視目標物件狀態的物件,並且提供與核心物件非耦合的指定功能 外掛程式系統 class observerable public function removeobse...
PHP觀察者模式
我理解的觀察者模式就是,當我們觸發乙個事件的時候,想要把這個操作告訴給我想要告訴的物件,讓他們都執行這個操作,就是將他們繫結到這個事件下。1.定義乙個基類 用於新增觀察者也就是我想要通知的物件,還有通知觀察者 eventgenerator.php abstract class eventgenera...
觀察者模式 php
觀察者模式 當你的某個功能在後期可能新增很多不太相干的功能時,可以考慮使用觀察者模式,如乙個使用者登入類,後期可能要求,記錄登入使用者日誌,簡訊提醒,郵件提醒等功能.個人更願意叫他補丁模式.簡單說,就是將每個補丁定義為乙個類,這些補丁類實現同一介面,這些補丁類實現同一方法.原始類只要接收這些補丁類的...