參考:寫的內容
1、委託--它是乙個類,它定義了方法的型別,實現將方法作為引數傳遞給另乙個方法來呼叫,這種將方法動態的賦給引數的方式,可以避免了程式中過多的使用switch或if-else
//定義委託,它定義了可以代表方法的型別
public
delegate
void
greetingdelegate(
string
name); //
greetingdelegate類似於string等型別一樣。
public
greetingdelegate
delegate1;//定義乙個委託型別的變數---在客戶端可以對它進行隨意的賦值等操作,嚴重破壞物件的封裝性。
delegate1 = englishgreeting;
// 先給委託型別的變數賦值,注意第乙個賦值,不能使用 「+=」,否則報錯
delegate1 += chinesegreeting;
// 給此委託變數再繫結乙個方法
總結:使用委託可以將多個方法繫結到同乙個委託變數,當呼叫此變數時(這裡用「呼叫」這個詞,是因為此變數代表乙個方法),可以依次呼叫所有繫結的方法。
2、事件
event,它封裝了委託型別的變數,使得:
在類的內部,不管你宣告它是public還是protected,它總是private的。在類的外部,註冊「+=」和登出「-=」的訪問限定符與你在宣告事件時使用的訪問符相同。
public event
greetingdelegate
makegreet ;
gm.makegreet = englishgreeting;
// 編譯錯誤1--只能使用「+=」或者「-=」
gm.makegreet += chinesegreeting;
3、委託、事件和observer模式
設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候:1、揚聲器會開始發出語音,告訴你水的溫度;2、液晶屏也會改變水溫的顯示,來提示水已經快燒開了。
現在我們需要寫個程式來模擬這個燒水的過程,我們將定義乙個類來代表熱水器,我們管它叫:heater,它有代表水溫的字段,叫做temperature;當然,還有必不可少的給水加熱方法boilwater(),乙個發出語音警報的方法makealert(),乙個顯示水溫的方法,showmsg()。
observer設計模式中主要包括如下兩類物件:
subject:監視物件,它往往包含著其他物件所感興趣的內容。在本範例中,熱水器就是乙個監視物件,它包含的其他物件所感興趣的內容,就是temprature欄位,當這個欄位的值快到100時,會不斷把資料發給監視它的物件。
observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。在本範例中,observer有警報器和顯示器,它們採取的行動分別是發出警報和顯示水溫。
在本例中,事情發生的順序應該是這樣的:
警報器和顯示器告訴熱水器,它對它的溫度比較感興趣(註冊)。
熱水器知道後保留對警報器和顯示器的引用。
熱水器進行燒水這一動作,當水溫超過95度時,通過對警報器和顯示器的引用,自動呼叫警報器的makealert()方法、顯示器的showmsg()方法。
類似這樣的例子是很多的,gof對它進行了抽象,稱為observer設計模式:observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。observer模式是一種松耦合的設計模式。
學習總結 委託和事件
委託其實是一種型別,是一種定義方法簽名的型別,它支援以new的方式來例項化。委託是使用關鍵字delegate進行定義的,它其實是對方法的包裝和聚集。1.任何與委託簽名匹配的方法都可以分配給委託,實際上是讓這個委託型別繼承了system.multicastdelegate類,system.mutica...
委託和事件學習筆記
委託本身可以使用賦值 name 委託 englishgreeting chinesegreeting 觀察者模式 public class greetingmanager 在客戶端,呼叫看上去更簡潔一些 static void main string args 輸出為 morning,jimmy z...
委託和事件學習筆記
class program class director 處理玩遊戲者 public void playgamehandler object sender,system.eventargs e class employee set 初始化員工類 public employee 開始玩遊戲了 publ...