您的位置:首页 > 其它

Delegate总结

2013-09-26 11:28 204 查看
关于Delegate已经写了很多,现总结如下。

一) 一条线是观察delegate从.net framework 1.1 到目前为止4.5的变迁;

例如如果你用delegate来模拟事件,你需要自己:

// Add member to the invocation list.

public
void OnAboutToBlow(AboutToBlow clientMethod)
{ almostDeadList += clientMethod; }
而在.NET Framework 1.1中你可以:
//服务端代码:
publicclass
Car
{
// This delegate works in conjunction with the
// Car’s events.
public
delegate
voidCarEventHandler(string msg);

// This car can send these events.
public
event CarEventHandler Exploded;
public
event CarEventHandler AboutToBlow;
}
//客户端代码:
// Register event handlers.
c1.AboutToBlow +=new
Car.CarEventHandler(CarIsAlmostDoomed);

而在.NET Framework 2.0中:
//服务端代码:
public
classCarPlus
{
public
event EventHandler<CarEventArgs> Exploded;
public
event EventHandler<CarEventArgs> AboutToBlow;
}
//客户端代码:
// Make a car as usual.
CarPlus c1 =new
CarPlus("SlugBug", 100, 10);
// Register event handlers.
c1.AboutToBlow += CarIsAlmostDoomed;
c1.AboutToBlow += CarAboutToBlow;

而在.NET Framework 3.0之后:
可以仔细体会Delegate与泛型,lambda表达式等的结合。Action, Func等的引入。Asynchronous Delegate等。
二)一条线是理解其意图(Intention)和几种应用的典型模式。
无论是对Document还是对Car的处理(这些都是书上列举的经典示例用来说明Delegate),会发现一个共同点。尽管有许多不同的方法,例如WashCar, RotateTire等,但它们的signature是一样的,有一个唯一的参数即Car。这里需要处理两个变化,一是这些类似的方法可能会增加;一是用户使用的时候对这些方法是任意组合的。之前的类图包括Garage,
Car, 现在引入委托后变为Garage, Car, ServiceDepartment。仔细体会这个模式是如何处理前面所述的两个变化的。方法增加用户可以通过扩充ServiceDepartment来实现,客户端调用时的任意性则用Delegate来实现。
另一个应用delegate的典型场景是Strategy pattern。例如排序,用户通常需要根据实际情况动态选择排序算法,这就需要排序逻辑isolate出来。这个在LINQ中应用及其广泛,例如where子句中的predicate谓词逻辑都需要隔离出来由用户决定。
还有一个典型场景就是用Delegate来模拟Event。事实上这个场景都可以用event来实现,而将所需传递的信息封装在EventArgs中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: