委托应用实例

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

直接上代码。

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

 

   

ContractedBlock.gif ExpandedBlockStart.gif 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.

 

ContractedBlock.gif ExpandedBlockStart.gif 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()的方式。

 

 

转载于:https://www.cnblogs.com/lsjwzh/archive/2010/03/13/1684967.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值