来源:懒得安分
链接: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来传递,方法的数量没有什么严格的限制。
当然其他设计模式也可以使用委托去优化设计,博主在这里就暂时只分享这三种模式的异同。总的来说,委托不可能代替多态去实现各种模式,但是它和多态联合起来使用可以实现更加灵活的设计。通过这两篇下来,不知道你是否对委托有点感觉了呢,委托这东西,重在实战,就像游泳一样,如果不用那么几次,你永远也不可能学会。以上只是博主个人的理解,可能很多方便没有考虑得那么全面,希望各位园友拍砖斧正~~
联系客服