saville

博客园 首页 新随笔 联系 订阅 管理

委托是C#中的一种类型,它类似于C++中的函数指针,不同的是委托是类型安全的。在实际应用中,委托一个很大的作用就是实现了对方法变化的封装。

前阵子我就碰到了一个例子,改动一下拿出来进行演示。需求大体是这样的,根据提供的人员名单得出这些人员手机号码的列表,人员与手机号码的对应关系保存在数据库中。很简单的一个需求,实现代码如下:

View Code
1 public IList<string> GetSMSList(List<string> userList)
2 {
3 List<string> phoneList =new List<string>();
4 foreach (string user in userList)
5 {
6 phoneList.Add(GetUserMobilePhone(user));
7 }
8 return phoneList;
9 }

 其中GetUserMobilePhone方法从数据库中取得指定人员的手机号。

现在问题出来了,假如将来需求发生了变化,要求支持通过读取文本文件等其它途径获取人员与手机号码的对应关系怎么办呢?熟悉设计模式的程序员马上就会想到Strategy模式。没错,Strategy模式可以解决这一问题,但它的缺点在于需要为每一种策略创建一个新类。这就增加了系统中需要维护的类的数量,在这个例子中,Strategy模式显然是过于重量级。这时我就想到了委托。

顺便提一句,在.NET Framework里已经定义了17个Action委托和17个Func委托 

publicdelegatevoid Action()
publicdelegatevoid Action<T>(T obj)
...
publicdelegatevoid Action<T1 arg1,...,T16 arg16)
publicdelegate TResult Func<TResult>()
publicdelegate TResult Func<T,TResult>(T arg)
...
publicdelegate TResult Func<T1,...,T16,TResult>(T1 arg1,...,T16 arg16)

因此在实际开发中我们只需要使用这些委托类型,而无需自己定义更多的委托。

修改后的代码如下: 

View Code
1 public IList<string> GetSMSList(List<string> userList, Func<string, string> getUserPhone)
2 {
3 List<string> phoneList =new List<string>();
4 foreach (string user in userList)
5 {
6 phoneList.Add(getUserPhone(user));
7 }
8 return phoneList;
9 }
10
11  public IList<string> GetSMSList()
12 {
13 return GetSMSList(GetUserMobilePhone);
14 }
posted on 2011-05-22 11:08  saville  阅读(374)  评论(0编辑  收藏  举报