Delegate和Command Pattern

本文探讨了Delegate在C#中的灵活性及其带来的优势,通过实例展示了其在计算工资场景的应用,与接口进行对比,并阐述了多播功能及与Command模式结合的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Delegate就是接口,我是这样理解它的.
后来发现Delegate比起接口可以"乱用".因为它只要方法的签名一样就可以替换.比如下面这个例子.

 

public class Client       public  dalegate int AddHandle(int a, int b);       public  AddHandle Add ;          
    
public  void Do()      {        //        Add(2,3);      } }
  public class Math      publicint Add(int a,int b)                return a+b;      }            publicint Sub(int a,int b)                return a-b;      }      }

这下可好,如果象下面这样用,结果岂不变成-1了

Client c = new Client();  c.Add = new Client.AddHandle( new Math().Sub); 
c.Do();

如果用接口,约束性就强了点.

public class Client {     public AddHandle iadder;         publicvoid Do()         {            //            iadder.Add();         } } public interface AddHandle
{     int Add(int a, int b); } public class Client {     public AddHandle Add; } public class Math : AddHandle {     publicint Add(int a, int b)     {         return a + b;     }     publicint Sub(int a, int b)     {         return a - b;     } } Client c = new Client(); 
c.iadder
= new Math(); c.Do();

这样不太可能出上面那样的错误. 不过Delegate这么灵活也不全是错.
如果Math中的方法是Static的(也是很有可能的),那接口就傻眼了,但是Delegate照样能搞定.
根据Delegate的这个灵活的特点,我想了一个合理的应用---计算工资.

public   delegate double OperationHandle( double a, double b);
public class Math {     publicint Add(int a,int b)     {           return a+b;     }          publicint Sub(int a,int b)     {           return a-b;     } } private int wage = 0 ; public void ModifyWage( int   value,OperationHandle operation) { int newWage= operation(wage, value); wage= newWage; }

加加减减,甚至乘除,只要绑定上不同的operation就ok了,这样岂不是很方便? 如果用接口实现呢?

public interface OperationHandle { int Execute(int a, int b); } public class Add : OperationHandle { publicint Execute(int a, int b) {   return a + b; } } public class Sub: OperationHandle { publicint Execute(int a, int b) {   return a - b; } } private int   wage = 0 ; public void ModifyWage( int value,OperationHandle operation) { int  newWage= operation.Execute(wage, value); wage= newWage; }

可以看出这就是Command模式. 还有好玩的,Delegate不是可以使用多播嘛(+=),用在这里就更好玩了.

public   delegate int OperationHandle( int a, int b);
public class Math {     publicint Add(int a,int b)     {           return a+b;     }          publicint Sub(int a,int b)     {           return a-b;     } } private int wage = 0 ; public void ModifyWage( int [] value,OperationHandle operation) {                 int i=0;                 foreach(OperationHandle oh in operation.GetInvokeList())                 {         int newWage= oh(wage, value[i]);         wage+= newWage;                                    i++;                 } }

很方便吧,接口也能做.Command加上Composition,不过要想变换参数似乎有点困难,(这仅仅是个例子,不考虑那么多了)

public class Composite : OperationHandle {     IList operations =new ArrayList();     publicint Execute(int a, int b)     {         int result =0;         foreach(Operation o in operations)
            result
+= o.Execute(a, b);         return result;     }
    publicvoid AddOperation(Operation o)     {         operations.Add(o);     } }

看完这些你感觉怎么样?难怪有人说.net的架构师是Delegate先生,delegate做的事,interface
基本上都能做,不过delegate是带来了不少方便,不过初学者比较难理解delegate这个概念,而且如前文所说
delegate在带来灵活性的同时也带来了一定的危险.

转载于:https://www.cnblogs.com/tearer/archive/2012/05/29/2523617.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值