13委託和事件在觀察者模式中的應用

2021-09-07 22:34:34 字數 2310 閱讀 2894

當乙個被監視物件的方法執行會觸發觀察者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)觀察者模式

在寫這篇文章之前,已經寫過了幾篇關於改物件委託主題的文章,想要了解的朋友可以去翻一下之前的文章 它是這樣定義的 觀察者模式定義了一種一對多的依賴關係 讓多個觀察者物件同時監聽某乙個主題物件 這個主題物件再狀態發生變更時 會通知全部觀察者物件 使它們能夠自動更新自己 我的懂得是這樣的,在公共課上,教師...