委托应用实例

需求:根据传入的action参数,自动构造与之对应的request。

直接上代码。

先定义一个MyRequest类。下有子类:AddRequest,LoadRequest,DeleteRequest。

 

   

MyRequest
1 public class MyRequest
2 {
3 public string Action { get; private set; }
4 //public GridPagerParams Pager { get; private set; }
5  
6 public MyRequest()
7 {
8
9 }
10 public virtual string Msg()
11 {
12 return Action.ToString();
13 }
14 }

MyRequest定义了一个虚方法 Msg();

各个子类由于算法不同,可重写该方法。

下面是关键:MyRequestCreator

MyRequestCreator 负责判断参数action,并返回相应的 request.

 

MyRequestCreator
public class MyRequestCreator
{
private static Dictionary<string, MyRequestCreator._newMyType> _CreatorDict = new Dictionary<string, MyRequestCreator._newMyType>();
private delegate MyRequest _newMyType();
static MyRequestCreator()//初始化
{
_CreatorDict.Add(
"load", new MyRequestCreator._newMyType(delegate() { return new LoadRequest(); }));
_CreatorDict.Add(
"add", new MyRequestCreator._newMyType(delegate() { return new AddRequest(); }));//
_CreatorDict.Add("delete", new MyRequestCreator._newMyType(delegate() { return new MyRequest(); }));
}
public static MyRequest CreateHandler(string action)
{
if (_CreatorDict.ContainsKey(action))
{
MyRequest retHandler
= _CreatorDict[action].Invoke();
try
{
return retHandler;
}
catch (Exception e)
{
throw new Exception("请求处理失败!", e);
}
}
return null;
}
}

客户端调用时:

MyRequest request = MyRequestCreator.CreateHandler("load");

这样就可以生成MyRequest的具体子类,并以MyRequest方式使用它的功能。

整个过程完全没有if或者case,配合emit还可以实现动态增加MyRequest的子类并注册到MyRequestCreator中去。

更重要的是,使用这种方式,比根据Activator.CreateInstance(typeof(MyRequest));产生的对象要快的多,接近于直接使用new object()的方式。

 

 

posted @ 2010-03-13 11:08 lsjwzh 阅读(...) 评论(...) 编辑 收藏