19使用推模式和拉模式實現電梯超重報警

2021-09-26 04:05:49 字數 4171 閱讀 3481

當電梯超過最大承重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 ...