當電梯超過最大承重800公斤,報警器報警。把電梯看成被觀察者,報警器看成觀察者。分別使用推模式和拉模式實現超重報警。
推模式實現超重報警
被觀察者在執行本身方法的時候,達到一定條件,就觸發通知事件,把自己的狀態"推"個觀察者。
→把電梯看作是被觀察者,當執行其testweight()方法時候,如果滿足某種weight變數》800,就觸發方法把自己的狀態推給觀察者。
1://被觀察者
2:public
class elevator : subjectbase
3:
13:
14:public
void testweight()
15:
24: }
25: }
26: }→elevator把自己的狀態資訊封裝成morethanstandardeventargs類,推送給觀察者。
1://觀察者和被觀察者之間傳遞的引數
2:public
class morethanstandardeventargs
3:
14:
15:public
int weight }
16:public
string factory }
17:public
string area }
18: }→elevator本身沒有註冊、登出、通知觀察者的能力,所以需要繼承有這些能力的基類subjectbase。
1://被觀察者基類抽象類
2:public
abstract
class subjectbase : iobseervable
3:
9:
10:public
void unregister(iobserver obj)
11:
14:
15:protected
virtual
void notify(morethanstandardeventargs e)
16:
21: }
22: }→而iobservalble的介面就註冊和取消註冊2個行為。
1://被觀察者介面
2:public
inte***ce iobseervable
3:→觀察者介面拿到被觀察者推來的資訊,做自己的事。
1://觀察者介面
2:public
inte***ce iobserver
3:→觀察者就把狀態資訊顯示出來
1://觀察者
2:public
class alarm : iobserver
3: 的電梯最大承重800kg,目前重量為",e.area,e.factory,e.weight);
7: }
8: }→主程式
1:class program
2:
12: }結果:
拉模式實現超重報警
觀察者把被觀察者拉進來作為方法引數,當被觀察者在執行本身方法的時候,達到一定條件,就觸發通知事件,並把自己傳遞給觀察者方法。
→被觀察者elevator執行方法滿足條件就觸發通知
1://被觀察者
2:public
class elevator : subjectbase
3: }
9:public
string factory }
10:public
string area }
11:
12:protected
virtual
void onmorethanstandard()
13:
16:
17:public
void testweight()
18:
26: }
27: }
28: }
29:→被觀察者elevator本身沒有註冊、取消註冊、通知觀察者的能力,需要繼承擁有這些能力的subjectbase。
1://被觀察者基類
2:public
abstract
class subjectbase : iobservable
3:
10:
11:public
void unregister(iobserver obj)
12:
15:
16:protected
virtual
void notify(iobservable obj)
17:
22: }
23: }→觀察者呼叫自己拉進來的觀察者物件獲得其狀態資訊
1://觀察者介面
2:public
inte***ce iobserver
3:
6:
7://觀察者
8:public
class alarm : iobserver
9: 的電梯最大承重800kg,目前重量為", elevator.area, elevator.factory, elevator.weight);
14: }
15: }→ 主程式
1:class program
2:
12: }結果:
推模式和拉模式的區別
● 推模式的好處是按需供給:觀察者需要什麼狀態資訊,被觀察者就把需要的狀態資訊封裝起來推給觀察者。缺點是需要建立封裝的狀態資訊。
● 拉模式的好處是不需要建立推送給觀察者的、封裝狀態的資訊。缺點是把被觀察者的屬性和方法暴露給了被觀察者。
而微軟定義的委託eventhandler則很好解決了推和拉的問題,不僅可以拿到被觀察者本身,同時可以拿到觀察者的狀態資訊:
public
delegate
void eventhandler(object sender, eventargs e)
UDX推模式與拉模式
目前udx主要是以推模式包裝介面的。使用者不用關心資料從何而來,當有新的聯接進來,或資料到來時,甚至資料被成功傳送後,都會有事件主動上報,這種主動上報的方式,就是推模式 使用者不用自己管理這些事件,由udx底層來通知,好處是,效率較高,實時。有時,應用程式以流式資料在應用程式之間傳遞時,有比較複雜的...
觀察者模式(推模型 拉模型)
觀察者模式 observer pattern 當乙個物件被修改時,會自動通知它的依賴物件 現在我們是新聞社,要向所有新聞訂閱者推送新聞。那麼該如何實現呢?經過思考我們不難發現一家新聞社一般對應的是多個新聞訂閱者。那麼我們先從新聞社開始入手,想一想新聞社要具備哪些基本功能呢?1.新聞,2.有哪些訂閱者...
C winform 窗體資料推入和拉模式
form1是接收資料窗體,乙個label負責顯示 getdataform是資料寫入窗體,負責資料的推送 心得 窗體初始化 public getdataform form1 invoker this 例項化getdataform窗體,乙個有引數的建構函式的寫法 getdataform frm new ...