来源:懒得安分 链接:http://www.cnblogs.com/landeanfen/p/4710174.html
三、模板方法模式,这里就以设备采集为例来进行说明:
1、多态实现模板方法模式:
class Program4 { static void Main(string[] args) { var oTem1 = new DeviceMML(); oTem1.Spider(); Console.WriteLine(''); var oTem2 = new DeviceTL2(); oTem2.Spider(); Console.ReadKey(); } } public abstract class TempleteDevice { // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序 public void Spider() { Console.WriteLine('设备采集开始'); this.Login(); this.Validation(); this.SpiderByType1(); this.SpiderByType2(); this.LoginOut(); Console.WriteLine('设备采集结束'); } // 登陆 public void Login() { Console.WriteLine('登陆'); } // 验证 public void Validation() { Console.WriteLine('验证'); } // 采集 public abstract void SpiderByType1(); public abstract void SpiderByType2(); // 注销 public void LoginOut() { Console.WriteLine('注销'); } } //MML类型的设备的采集 public class DeviceMML : TempleteDevice { public override void SpiderByType1() { Console.WriteLine('MML类型设备开始采集1'); //....... } public override void SpiderByType2() { Console.WriteLine('MML类型设备开始采集2'); } } //TL2类型设备的采集 public class DeviceTL2 : TempleteDevice { public override void SpiderByType1() { Console.WriteLine('TL2类型设备开始采集1'); //....... } public override void SpiderByType2() { Console.WriteLine('TL2类型设备开始采集2'); } }
父类里面的非abstract方法都是模板方法,也就是子类公用并且不可以重写的方法。SpiderType1和SpiderType2是需要子类重写的方法。模板方法模式在抽象类中定义了算法的实现步骤,将这些步骤的实现延迟到具体子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术。
2、使用委托改写后:
class Program4 { static void Main(string[] args) { var oTem1 = new TempleteDevice(DeviceMML.SpiderByType1, DeviceMML.SpiderByType2); oTem1.Spider(); Console.WriteLine(''); var oTem2 = new TempleteDevice(DeviceTL2.SpiderByType1, DeviceTL2.SpiderByType2); oTem2.Spider(); Console.ReadLine(); } } public delegate void DeviceDelegate(); public class TempleteDevice { public DeviceDelegate oDelegate; public TempleteDevice(params DeviceDelegate[] lstFunc) { foreach (var oFunc in lstFunc) { oDelegate += oFunc; } } // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序 public void Spider() { Console.WriteLine('设备采集开始'); this.Login(); this.Validation(); if (oDelegate != null) { oDelegate(); } this.LoginOut(); Console.WriteLine('设备采集结束'); } // 登陆 public void Login() { Console.WriteLine('登陆'); } // 验证 public void Validation() { Console.WriteLine('验证'); } // 注销 public void LoginOut() { Console.WriteLine('注销'); } } //MML类型的设备的采集 public class DeviceMML { public static void SpiderByType1() { Console.WriteLine('MML类型设备开始采集1'); //....... } public static void SpiderByType2() { Console.WriteLine('MML类型设备开始采集2'); } } //TL2类型设备的采集 public class DeviceTL2 { public static void SpiderByType1() { Console.WriteLine('TL2类型设备开始采集1'); //....... } public static void SpiderByType2() { Console.WriteLine('TL2类型设备开始采集2'); } }
得到结果:

优化模板方法模式的意义:
(1)解除了子类和父类之间的继承关系,更好地实现了对象间的低耦合。
(2)采用委托可以动态实现方法的组合,这种方式更加灵活,子类可以更加灵活的设计不同部分的方法。然后方法的数量通过params来传递,方法的数量没有什么严格的限制。
当然其他设计模式也可以使用委托去优化设计,博主在这里就暂时只分享这三种模式的异同。总的来说,委托不可能代替多态去实现各种模式,但是它和多态联合起来使用可以实现更加灵活的设计。通过这两篇下来,不知道你是否对委托有点感觉了呢,委托这东西,重在实战,就像游泳一样,如果不用那么几次,你永远也不可能学会。以上只是博主个人的理解,可能很多方便没有考虑得那么全面,希望各位园友拍砖斧正~~
|