C 基礎系列 委託實現簡單設計模式

2022-01-16 12:11:26 字數 3740 閱讀 9439

一、什麼是委託:c# 中的委託(delegate)類似於 c 或 c++ 中函式的指標。用博主的話說,委託就是一種允許將方法名稱作為引數傳遞的引用型別。它定義的是方法的型別,可以說就是方法的抽象,那麼反過來說,方法可以理解為委託的例項,如public delegate void testdelegate(string str);這種委託定義的就是所有引數型別為string,沒有返回值的方法的一種抽象。

二、為什麼要使用委託:記得博主剛開始做專案的時候看到委託的寫法就頭大,總覺得這是沒事找事,唯一的好處貌似就是**看上去很酷~~隨著工作的累積,發現專案中某些小的需求使用這種輕量級的委託來實現的時候確實能減少很多**量。

三、委託的使用:

1、.net framework 裡面的委託型別:使用過委託的朋友可能注意到了c#裡面定義了兩種型別的委託變數,基本能滿足我們的一般需求。

(1)action型別的委託:c#裡面定義action委託用於抽象化那種沒有返回值的方法。將action變數轉到定義可知它的最簡單形式:

//

摘要:

//封裝乙個方法,該方法不具有引數並且不返回值。

[typeforwardedfrom("

system.core, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089")]

public

delegate

void action();

它定義是就是一種沒有返回值沒有引數的委託。同時action還提供了16個泛型的委託,用於定義方法的傳入引數:

我們來看他們的使用方法,我們首先定義測試的方法:

private

static

void test5(int a, int b, int

c)

//無引數無返回值

private

static

void

test1()

//有引數無返回值

private

static

void test2(string

str)

//無引數有返回值

private

static

object

test3()

//有引數有返回值

private

static

object test4(string

strres)

呼叫:

static

void main(string

args)

);oaction3.invoke(

1, 2, 3

); }

(2)func型別的委託:還記得linq裡面的擴充套件方法where()、select()等方法的引數嗎。public static ienumerablewhere(this ienumerablesource, funcpredicate)。這裡的引數就是乙個func型別的委託。c#裡面func型別的委託用於處理有引數有返回值的方法。不多說,上**:

static

void main(string

args)

知道了func的方法就可以推想到我們神奇的lamada表示式了,其實lamada表示式就是乙個匿名的委託。

var lsttest = new list();

var lstres = lsttest.where(x => x.contains("

_"));

這個where裡面的lamada表示式我們把他拆解:

private

static

bool testwhere(string

x)

var ofunc = new func(testwhere);

lstres = lsttest.where(ofunc);

是不是一樣一樣的~~ 

2、自定義委託:

public

delegate

void testdelegate(string str);

其實很多人應該都自己寫過action、func型別的委託。其實自己定義乙個泛型委託也很簡單:

public

delegate

void myaction();

public

delegate tresult myfunc(t arg);

其實使用起來和系統的action和func基本沒有區別。

3、委託的合併和拆解就放在事件裡面分享了。這篇且過之。。。

4、如果按照上面的方法去使用委託,那真的是要彆扭死人了,因為呼叫方法直接用方法名呼叫就好了,何必還要定義乙個委託變數去呼叫,這不是將簡單問題複雜化麼。確實,上面只是為了介紹委託而寫的**,實際專案中肯定不會這麼用。其實委託在專案中一般用在將委託變數作為引數傳遞或者函式**。來看下面**:

class

program

}public

delegate

string mydelegate(string s1, string

s2);

public

class

person

public

string chinesesayhello(string s1, string

s2)

public

string englishsayhello(string s1, string

s2)

public

string japanesesayhello(string s1, string

s2)

}

得到結果:

public string processfunc(string s1, string s2, mydelegate process)裡面定義了乙個**函式,可以將任意乙個符合這個委託的方法傳遞進去,得到想對應的結果。細看這種設計是不是和工廠設計模式十分相似,我簡單構造了個工廠:

public

class

person

}public

class

chinese : person

}public

class

english : person

}public

class

japanese : person

}//main函式裡面呼叫

class

program

public

static person getperson(string

strtype)

}

得到結果和上面相同:

這樣一比較是不是對委託的用法有點感覺了呢~~如果你不怕麻煩,可以在專案是用起來試試,相信你會有收穫~~

簡單設計模式

簡單工廠模式屬於類的建立型模式,又叫做靜態工廠方法模式。通過專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。1.工廠 creator 角色 簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類可以被外界直接呼叫,建立所需的產品物件。2.抽象 product 角色 簡單...

PHP設計模式系列 委託模式

通過分配或委託其他物件,委託設計模式能夠去除核心物件中的判決和複雜的功能性。php view plain copy print?委託模式 去除核心物件中的判決和複雜的功能性 class cd public function play song public function playmp4 song...

PHP設計模式系列 委託模式

通過分配或委託其他物件,委託設計模式能夠去除核心物件中的判決和複雜的功能性。委託模式 去除核心物件中的判決和複雜的功能性 class cd public function play song public function playmp4 song oldcd new cd oldcd addson...