沒用設計模式的**,這樣的**要是把最上面那部分也要符合要求加進來,就要修改**,不符合寧增不改的原則
觀察者模式定義物件的一對多依賴,這樣一來,當乙個物件改變狀態時,它的所有依賴者都會收到通知並自動更新!
所有的觀察者(observer)全部被註冊(register函式)進入陣列(事件的_observers陣列),這樣,當事件(例子中是*****)有變化的時候,就能通過遍歷(**19行)來通知所有的觀察者。每個觀察者再做他們自己對應的更新(**20行)。
在觀察者模式中,會改變的是主題的狀態以及觀察者的數目。用這個模式,你可以改變依賴於主題狀態的物件,卻不必改變主題。——找出程式中會變化的方面,然後將其和固定不變的方面相分離!
主題和觀察者都使用介面:觀察者利用主題的介面向主題註冊,而主題利用觀察者介面通知觀察者。這樣可以讓兩者之間運作正常,又同時具有松耦合的優點! ——針對介面程式設計,不針對實現程式設計! 。
觀察者模式利用「組合」將許多觀察者組合進主題中。物件(觀察者——主題)之間的這種關係不是通過繼承產生的,而是在執行時利用組合的方式產生的。 ——多用組合,少用繼承!
1下面是測試**<?php2 /*
*3* 觀察者模式
4* @author: mac
5* @date: 2012/02/226*/
789class *****
1516
17public
function trigger()22}
23}24}
2526/**
27* 觀察者要實現的介面
28*/
29inte***ce
observerable
3233
class subscriber implements
observerable
37 }
1當新物件要填入的時候,只需要在主題(又叫可觀察者)中進行註冊(註冊方式很多,你也可以在構造的時候,或者框架訪問的介面中進行註冊),然後實現**直接在新物件的介面中進行。這降低了主題物件和觀察者物件的耦合度。/*測試 */2
$***** = new
*****();
3$*****->register(new
subscriber());4//
$*****->register(new subscriber1());
5//$*****->register(new subscriber2());
6$*****->trigger();
好的設計模式不會直接進入你的**中,而是進入你的大腦中。
1/**2* 事件產生類
3* class eventgenerator4*/
5abstract
class
eventgenerator614
15//
事件通知
16public
function
notify()
1721}22
23}2425/**
26* 觀察者介面類
27* inte***ce observer
28*/
29inte***ce
observer
3033
34/**35
* 觀察者1
36*/
37class observer1 implements
observer
3843}44
45/**46
* 觀察者1
47*/
48class observer2 implements
observer
4954}55
56/**57
* 事件
58* class event
59*/
60class event extends
eventgenerator
6170}71
72//
建立乙個事件
73$event = new
event();
74//
為事件增加旁觀者
75$event->add(new
observer1());
76$event->add(new
observer2());
77//
執行事件 通知旁觀者
78$event->trigger();
觀察者模式(訂閱模式)
定義物件間一種一對多的關係,使得每當乙個物件改變狀態,則所有依賴他的物件都會得到通知並被自動更新。使用場景 1 某些時候需要一些物件有所關聯,而且這種關聯是可以拆分而不是組合在一起的。2 某一事件發生,需要向多方觸發。3 訊息交換,如訊息佇列 事件匯流排的處理機制。1 subject 抽象主題,被觀...
訂閱者模式(觀察者模式)
include include include struct notification virtual void process 0 class subscribera public notification class subscriberb public notification class p...
php設計模式之 觀察者模式
觀察者模式 observer 當乙個物件狀態發生改變時,依賴它的物件全部收到通知,並自動更新。抽象被觀察者 abstract class eventgenerator 通知所有觀察者 public function notify 具體被觀察者class event extends eventgene...