C 筆記11多播委託 事件 設計模式(觀察者模式)

2021-09-25 20:14:58 字數 4700 閱讀 4474

事件初步理解多播委託為委託列表

static action<

int> all;

static action<

int> addthenprint = i =

>

;static action<

int> print = i =

> console.

writeline

(i);..

.main(.

.)

多播委託,可以理解為乙個列表,只要其中元素函式簽名一致,就可以記錄在一起。多播委託就是多個委託的列表。

報社發報案例

class

person

public

person

(string name)

public

void

setnews*****

(news***** news*****)

}class

publisher

public

person

(string name)

public

void

sendnews*****

(news***** news*****)

}class

news*****

public

string content

}class

program);

}}

class

publisher

public

person

(string name)

public list persons =

newlist

<

person

>()

;public

void

sendnews*****

(news***** news*****)

}class

program);

}}

class

company

public

company

(string name)

public

void

setnews*****

(news***** news*****)

}

public list persons =

newlist

<

person

>()

;public list companies=

newlist

<

company

>()

;public

void

sendnews*****

(news***** news*****)

}

增加介面程式設計改善案例
inte***ce

inews*****

class

person

:inews*****

public

person

(string name)

public

void

setnews*****

(news***** news*****)

}class

company

:inews*****

public

company

(string name)

public

void

setnews*****

(news***** news*****)

}class

publisher

public

person

(string name)

public list subscribers=

newlist

<

inews*****

>()

;// 通過介面呼叫實現介面的類

public

void

sendnews*****

(news***** news*****)

}

再用委託型別對上例進行改善
//去掉介面

class

publisher

public

person

(string name)

// public listsubscribers= new list();

// 使用委託

public

delegate

void

_subscribers

(news***** news*****)

;// 委託是定義乙個類,再實現

public _subscribers subscribers

public

void

sendnews*****

(news***** news*****)

}class

program);

}}

//去掉介面

class

publisher

public

person

(string name)

// public listsubscribers= new list();

// 使用委託

// public delegate void _subscribers(news***** news*****);

// 委託是定義乙個類,再實現

// public _subscribers subscribers

public action subscribers =

null

;// 預設應該為null

public

void

sendnews*****

(news***** news*****)

}

class

publisher

}}

委託鏈的異常
class

publisher

catch

(exception ex)

}subscribers

(news*****);}

}}

提供封裝,程式更健壯
class

publisher

catch

(exception ex)

}subscribers

(news*****);}

}}

publisher.

subscribers

(null);

// 外部不能直接呼叫event委託

提供更加抽象的事件用法
class

publisher1

catch

(exception ex)

}subscribers

(news*****);}

}}

class

person

public

person

(string name)

public

void

setnews*****

(object sender,

news***** news*****)..

.this

.news***** = news*****;

}}

system.eventargs傳入引數
class

publisherargs

:system.eventargs

public

news***** news*****

}

class

publisher1

catch

(exception ex)

}subscribers

(news*****);}

}}

class

person

public

person

(string name)

public

void

setnews*****

(object sender,

publisherargs args)}}

// 許多地方簽名要改為args.news*****

使用系統預定義的泛型委託
public

delegate

void

eventhandler

<

t>

(object sender,

t e)

where t : eventargs;

add、remove關鍵字
public

event eventhandler subscribers

remove

// 與+= 、-=效果類似

}

C Observer設計模式(委託 事件)

observer設計模式中主要包括如下兩類物件 subject 監視物件,它往往包含著其他物件所感興趣的內容。在本範例中,熱水器就是乙個監視物件,它包含的其他物件所感興趣的內容,就是temprature欄位,當這個欄位的值快到100時,會不斷把資料發給監視它的物件。observer 監視者,它監視s...

c 工廠模式 ,委託 ,事件。

有些時間 不用 c 了 想 寫 委託 和 事件 又會 卡下 之前也沒認真總結過。乾脆 做個小結 什麼是委託 狹義,不安全函式的指標。不安全在 任何地方都可以呼叫委託物件。實際上委託物件才是函式的指標,而delegate只是乙個語法 什麼是事件 狹義,安全的函式指標,安全在 只允許包含事件的類,的內部...

c 11委託 事件 反射

using system using system.collections.generic using system.linq using system.text namespace 11 using system using system.collections.generic using sys...