委托和设计模式(2)(下)

2016-3-28 | 发布者:DotNet

(点击上方蓝字,可快速关注我们)


来源:懒得安分

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


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






热门文章

更多

职场人

加载更多