當乙個被監視物件的方法執行會觸發觀察者observer的方法的時候,我們就可以在被監視物件中宣告委託和事件。
例子有乙個寵物追蹤器掛寵物身上,只要寵物離開主人100公尺之外,主人手上的顯示器顯示警告資訊並聲音報警。
1:class program
2:
9: }
10:
11:public
class pettracker
12:
26: }
27: }
28:
29://主人手上的追蹤器終端發出警報聲
30:private
void makealert(int param)
31:
34:
35://主人手上的追蹤器終端顯示報警資訊
36:private
void showalert(int param)
37:
40: }
41:結果:
定義被監視物件以及觀察者observer
假如把以上3個方法封裝到不同的類中去,那就是:
1:public
class pettracker
2:
15: }
16: }
17: }
18:
19:public
class makeralertsupplier
20:
26: }
27:
28:public
class showalertsupplier
29:
35: }
36:我們需要解決的問題是:
在pettracker類的instancetrack()方法中,一旦distance > 100,該如何通知makeralertsupplier和showaleartsupplier呢?
如何看待上面的3個類:
● pettracker可以看作是被監視物件。
● makeralertsupplier和showaleartsupplier看作是觀察者,即observer。
解決方法:
1、考慮到observer的方法引數都是int型別,嗯是的,不同的方法名,相同的引數列表,我們當然可以在被監視物件中定義乙個委託,與observer方法有相同的引數列表。
2、如何做到被監視物件的委託被觸發從而觸發observer的方法呢?我們需要乙個委託型別的事件,通過事件變數,把observer的方法繫結到委託上。
3、最後當被監視物件執行方法時觸發委託型別的事件,從而觸發observer的方法。
完整如下:
1:class program
2:
12: }
13:
14:public
class pettracker
15:
33: }
34: }
35: }
36: }
37:
38:public
class makeralertsupplier
39:
45: }
46:
47:public
class showalertsupplier
48:
54: }
55:結果:
總結:● 對於方法名不同,引數列表相同的多個類方法或方法,委託抽象了他們的定義。
● 而委託的執行和註冊就交給了委託型別的事件來做。
● 委託是侷限在被監視物件內部的,雖然宣告是public,但在客戶端不能給被監視物件的委託變數賦值。
13委託和事件在觀察者模式中的應用
當乙個被監視物件的方法執行會觸發觀察者observer的方法的時候,我們就可以在被監視物件中宣告委託和事件。例子有乙個寵物追蹤器掛寵物身上,只要寵物離開主人100公尺之外,主人手上的顯示器顯示警告資訊並聲音報警。1 class program 2 9 10 11 public class pettr...
c 觀察者模式和事件委託的聯合使用
using system using system.collections.generic using system.linq using system.text using system.threading.tasks 觀察者模式和事件委託的聯合使用 namespace 委託和事件2 警報類,ob...
物件委託(9)觀察者模式
在寫這篇文章之前,已經寫過了幾篇關於改物件委託主題的文章,想要了解的朋友可以去翻一下之前的文章 它是這樣定義的 觀察者模式定義了一種一對多的依賴關係 讓多個觀察者物件同時監聽某乙個主題物件 這個主題物件再狀態發生變更時 會通知全部觀察者物件 使它們能夠自動更新自己 我的懂得是這樣的,在公共課上,教師...