Delegate小结

Delegate总结

关于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中。