淺談為什麼設計模式要有觀察者模式--觀察者模式的意義
阿新 • • 發佈:2019-02-01
當一個物件狀態發生改變後,會影響到其他幾個物件的改變,這時候可以用觀察者模式。像wordpress這樣的應用程式中,它容外部開發組開發外掛,比如使用者授權的部落格統計外掛、積分外掛,這時候可以應用觀察者模式,先註冊這些外掛,當用戶釋出一篇博文後,就回自動通知相應的外掛更新。
觀察者模式符合介面隔離原則,實現了物件之間的鬆散耦合。
觀察者模式UML圖:
在PHP SPL中已經提供SplSubject和SqlOberver介面
- interface SplSubject
- {
-
function attach(SplObserver $observer);
//新增觀察者
- function detach(SplObserver $observer); //刪除觀察者
- function notify(); //通知訊息
- }
- interface SqlObserver
- {
- function update(SplSubject $subject); //觀察者方法
- }
- class Subject implements SplSubject
- {
- private$observers;
-
publicfunction attach(SplObserver $observer)
- {
- if (!in_array($observer, $this->observers)) {
- $this->observers[] = $observer;
- }
- }
- publicfunction detach(SplObserver $observer)
- {
- if (false != ($index = array_search($observer, $this->observers))) {
-
unset($this
- }
- }
- publicfunction post()
- {
- //post相關code
- $this->notify();
- }
- privatefunction notify()
- {
- foreach ($this->observers as$observer) {
- $observer->update($this); //執行觀察者實現的介面方法
- }
- }
- publicfunction setCount($count)
- {
- echo"資料量加" . $count;
- }
- publicfunction setIntegral($integral)
- {
- echo"積分量加" . $integral;
- }
- }
- class Observer1 implements SplObserver
- {
- publicfunction update($subject)
- {
- $subject-> setCount(1);
- }
- }
- class Observer2 implements SplObserver
- {
- publicfunction update($subject)
- {
- $subject-> setIntegral(10);
- }
- }
- class Client
- {
- publicfunction test()
- {
- $subject = new Subject();
- $subject->attach(new Observer1());
- $subject->attach(new Observer2());
- $subject->post();//輸出:資料量加1 積分量加10
- }
- }