打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
委托和设计模式(2)(下)


来源:懒得安分

链接: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来传递,方法的数量没有什么严格的限制。


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




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#软件设计
C#简明教程(三)
虚方法
简述c#之sealed 修饰符
C#中的运行时与编译时类型
C#接口
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服