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中。
一) 一条线是观察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中。
相关文章推荐
- Sql 数据库的基础语句(一)
- mvc3 小小班
- Eclipse 右键 New菜单项的自定义设置方法
- 32位 sql server 開啟/PAE /AWE /3GB
- std::vector<T>内存映像
- java中equals方法和“==”的比较
- ORACLE OEM简介(如何利用OEM查看oracle当前在执行哪些SQL语句)
- HTML5表单教程之input新增加的六种时间类型
- CSS中的小技巧/个人简洁
- it笔试题目(非技术)
- git clone时,提示warning: remote HEAD refers to nonexistent ref, unable to checkout.
- 认识和理解C++类(或C++类浅识)
- xtrabackup对MySQL数据库的备份及恢复
- COM 编程基础
- Linux学习之CentOS(二十九)--Linux网卡高级命令、IP别名及多网卡绑定
- "对象库未注册"问题
- MD5加密
- Linux命令(5):cd命令
- 花生壳实现外网访问内网的设置方法
- java编程过程中中如何在JFrame面板添加图片作为背景