委托技術(shù)與GOF設(shè)計模式中委托的關(guān)系
需要指出的是,.net中的委托技術(shù)與GOF在《設(shè)計模式》中所提列的委托的意圖一致,但在實現(xiàn)方法上有相當(dāng)大的區(qū)別。.NET中的委托更進(jìn)一步地降低了對象間的耦合性,將靜態(tài)的組合關(guān)系變?yōu)檫\行時的動態(tài)組合關(guān)系。
GOF在《設(shè)計模式》中定義的委托是:“委托是一種組合方法,它使組合具有與繼承同樣的復(fù)用能力。在委托方式下,有兩個對象參與處理一個請求,接受請求的對象將操作委托給它的代理者(delegate),它類似于子類將請求交給它的父類處理。使用繼承時,被繼承的操作總能引用接受請求的對象。在C++中通過this成員變量,在Smalltalk中則通過self。委托方式為了得到同樣的效果,接受請求的對象將自身傳給被委托者(代理人),使被委托的操作可以引用接受請求的對象?!?BR> 如果采用.NET的委托技術(shù),上述結(jié)構(gòu)可以更加靈活。Window不引用Rectangle即可實現(xiàn)Area的計算,為此首先聲明一個計算面積的委托定義,示例代碼如下:
public delegate float Darea();
然而在Window類中聲明與這個代理一致的接口:
class Window
{
public Darea Area;
}
這里不需要引用Rectangle類,只是在執(zhí)行時動態(tài)綁定即可:
Rectangle rc = new Rectangle();
Window w = new Window();
w.Area = new Darea(rc.Area);
這樣當(dāng)調(diào)用w的Area時,實際調(diào)用的是Reactangel的Area方法。從實現(xiàn)意圖上看,.NET的委托更好地實現(xiàn)了GOF所闡述的意圖,結(jié)構(gòu)上也更為靈活。但這兩種委托解決的不是一個層面的問題,GOF的委托強調(diào)的是一種策略,而.NET和委托技術(shù)則是具體實現(xiàn)。
委托技術(shù)與設(shè)計模式實現(xiàn)
采用委托技術(shù)可以進(jìn)一步實現(xiàn)用組合代替繼承的思路,很多采用繼承實現(xiàn)的關(guān)系可以采用委托實現(xiàn)。采用委托可以簡化下列設(shè)計模式的使用。
(1)模板方法:這種方法采用繼承實現(xiàn)具體方法,采用委托可以動態(tài)實現(xiàn)方法的組合。
(2)觀察者:可以使用事件委托實現(xiàn)觀察者與主題之間的通信。
(3)中介者:使用委托可以去除工件與中介者之間的耦合關(guān)系。
需要指出的是,.net中的委托技術(shù)與GOF在《設(shè)計模式》中所提列的委托的意圖一致,但在實現(xiàn)方法上有相當(dāng)大的區(qū)別。.NET中的委托更進(jìn)一步地降低了對象間的耦合性,將靜態(tài)的組合關(guān)系變?yōu)檫\行時的動態(tài)組合關(guān)系。
GOF在《設(shè)計模式》中定義的委托是:“委托是一種組合方法,它使組合具有與繼承同樣的復(fù)用能力。在委托方式下,有兩個對象參與處理一個請求,接受請求的對象將操作委托給它的代理者(delegate),它類似于子類將請求交給它的父類處理。使用繼承時,被繼承的操作總能引用接受請求的對象。在C++中通過this成員變量,在Smalltalk中則通過self。委托方式為了得到同樣的效果,接受請求的對象將自身傳給被委托者(代理人),使被委托的操作可以引用接受請求的對象?!?BR> 如果采用.NET的委托技術(shù),上述結(jié)構(gòu)可以更加靈活。Window不引用Rectangle即可實現(xiàn)Area的計算,為此首先聲明一個計算面積的委托定義,示例代碼如下:
public delegate float Darea();
然而在Window類中聲明與這個代理一致的接口:
class Window
{
public Darea Area;
}
這里不需要引用Rectangle類,只是在執(zhí)行時動態(tài)綁定即可:
Rectangle rc = new Rectangle();
Window w = new Window();
w.Area = new Darea(rc.Area);
這樣當(dāng)調(diào)用w的Area時,實際調(diào)用的是Reactangel的Area方法。從實現(xiàn)意圖上看,.NET的委托更好地實現(xiàn)了GOF所闡述的意圖,結(jié)構(gòu)上也更為靈活。但這兩種委托解決的不是一個層面的問題,GOF的委托強調(diào)的是一種策略,而.NET和委托技術(shù)則是具體實現(xiàn)。
委托技術(shù)與設(shè)計模式實現(xiàn)
采用委托技術(shù)可以進(jìn)一步實現(xiàn)用組合代替繼承的思路,很多采用繼承實現(xiàn)的關(guān)系可以采用委托實現(xiàn)。采用委托可以簡化下列設(shè)計模式的使用。
(1)模板方法:這種方法采用繼承實現(xiàn)具體方法,采用委托可以動態(tài)實現(xiàn)方法的組合。
(2)觀察者:可以使用事件委托實現(xiàn)觀察者與主題之間的通信。
(3)中介者:使用委托可以去除工件與中介者之間的耦合關(guān)系。