設計模式-觀察者模式

首先歡迎大家關注小編哦~~~

觀察者模式

(有時又被稱為發布-訂閱模式)。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。

重要角色:

抽象通知者角色(INotifier):定義了通知的介面規則。

具體通知者角色(Boss):實現抽象通知者的介面,接到狀態改變立即向觀察者下發通知。

抽象觀察者角色(IObserver):定義接到通知后所做的操作(Update)介面規則。

具體觀察者角色(JingDong):實現具體操作方法。

<?php//抽象通知者abstract class Subject{private $observers = array();public function Attach(Observer $observer) { array_push($this->observers, $observer);}public function Detach(Observer $observer) {foreach ($this->observers as $k => $v) {if ($v == $observer) {unset($this->observers[$k]);} } }function Notify() {foreach ($this->observers as $v) {$v->Update();} }}//具體通知者(Boss和Secretary)class ConcreteSubject extends Subject{public $subject_state;}//抽象觀察者abstract class Observer{public abstract function Update();}//具體觀察者class ConcreteObserver extends Observer{private $name;private $observerState;public $subject;public function __construct(ConcreteSubject $_sub, $_name) {$this->subject = $_sub;$this->name = $_name;}public function Update() {$this->observerState = $this->subject->subject_state;echo "觀察者" . $this->name . "的新狀態是:" . $this->observerState . "<br/>";}}

調用客戶端代碼:

Advertisements

<?phpheader("Content-Type:text/html;charset=utf-8");//-------------------------觀察者模式-----------------------require_once "./Observe/Observe.php";//前台$_s = new ConcreteSubject();//$baoyin = new ConcreteObserver($_s, "張三");$jiangchao = new ConcreteObserver($_s, "李四");//前台記下寶銀姜超$_s->Attach($baoyin);$_s->Attach($jiangchao);//前台發現老闆回來$_s->subject_state = "孫總回來了";//前台發送通知$_s->Notify();

優點:

1、一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。

Advertisements

2、一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,可以降低對象之間的耦合度。

3、一個對象必須通知其他對象,而並不知道這些對象是誰。需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。

Advertisements

你可能會喜歡