委托和设计模式(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来传递,方法的数量没有什么严格的限制。


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






热门文章

更多

推荐

紫气东来武神坛选拔逆袭战,被压九回合后终于…...

紫气东来武神坛选拔逆袭战,被压九回合后终于…...

前天我们欣赏了群星璀璨的选拔赛(戳我回顾),他们在逆风的情况下扭转了战局,最终取得了战斗的胜利。今天灵儿要给大家带来的是紫气东来的武神坛选拔赛,同样是逆风,他们又是如何实现逆转的呢?◈ 双方阵容 ◈...
网易梦幻西游手游 • 
太全了!天津14条地铁完整站点名单,有经过你家...

太全了!天津14条地铁完整站点名单,有经过你家...

潮人说根据天津地铁建设规划,天津加上在建地铁线路,共有14条线路将陆续建设开通,届时天津地铁将遍布全市。潮妹儿吐血整理了各大地铁的路线,快看看有几条经过你家门口~天津地铁1号线刘园(06:10-22:15) -- 双...
天津潮生活 • 
原来古代也有葛荟婕张馨予……

原来古代也有葛荟婕张馨予……

最关心子怡汪峰的,是前妻葛荟婕;最关心范爷李晨的,是前女友张馨予;最关心你微博朋友圈的,往往也是你的情敌;其实早在古代皇宫里,就有一群葛荟婕张馨予,时时刻刻捍卫着自己【爱情的巨轮】↓↓↓↓自从喵妃...
达达兔 • 
哈哈哈哈简直太会玩!这个真的可以有!

哈哈哈哈简直太会玩!这个真的可以有!

京都大学神经科学专业引入了弹幕系统,教授讲课学生可以随时提问,当然吐槽的也有~忽然脑补出每当老师划重点,屏幕上有一排“前方送分题高能预警”的画面233333~图自推特@himakacho @0202Mj哈哈哈哈简直太会玩!...
冷笑话 • 
疯狂学区房:“单价8万元买了一个猪窝”

疯狂学区房:“单价8万元买了一个猪窝”

2016年3月7日,北京西城区文昌胡同。(CFP/图)一位地产经纪人说,他有一位客户,连续抢了两天房子都没抢上,最后那套860万的房子,他只是在楼下远远指了指房子的位置和楼层,就说“要了要了”。一位家长曾花费...
南方周末 • 
加载更多

 更多推荐