• 设计模式------适配器模式(二)


    使用场景和原则:

      当系统的数据和行为都正确,但接口不符合时,我们应该考虑用适配器。适配器主要应用于希望复用现存的类,但是接口又与复用环境要求的不一致。就是说,两个类所做的事相同或者相似,但是具有不同的接口,这也是一种迫于无奈,双发都不太容易修

    改的时候。一般情况下,尽可能的前期不考虑适配器,当然了,如果像对接类似第三方组件之类的,没必要为了它改变自己的接口,那就可以考虑。像我们的 ADO.net里面的 DataAdapter。

      

    案例分析:

       姚明去NBA打球,刚到NBA语言不通,这个时候姚明有没有必要迅速学外语呢,答案肯定是否定的。那姚明要怎么跟人沟通?答案是:请一个翻译。照着这个思路,我们画一下类图。

     

    首先,球员的基本动作是Attack和Defense,球员拥有名字。

      public abstract class 球员
        {
           protected string name;
            public 球员 (string name)
            {
                this.name = name;
            }
    
            public abstract void Attack();
            public abstract void Defense();
        }

    球员分为三种,前锋,中锋,后卫。

        public class 前锋 : 球员
        {
            public 前锋(string name)
                : base(name)
            {
            }
    
            public override void Attack()
            {
                Console.WriteLine("前锋{0}发起进攻啦", name);
            }
    
            public override void Defense()
            {
                Console.WriteLine("前锋{0}立刻防守~", name);
            }
        }
    
    
    
        public class 中锋 : 球员
        {
            public 中锋(string name)
                : base(name)
            {
            }
    
            public override void Attack()
            {
                Console.WriteLine("中锋{0}发起进攻啦", name);
            }
    
            public override void Defense()
            {
                Console.WriteLine("中锋{0}立刻防守~", name);
            }
        }
    
        public class 后卫 : 球员
        {
            public 后卫(string name)
                : base(name)
            {
            }
    
            public override void Attack()
            {
                Console.WriteLine("后卫{0}发起进攻啦", name);
            }
    
            public override void Defense()
            {
                Console.WriteLine("后卫{0}立刻防守~", name);
            }
        }

    这个时候来了一个外籍中锋,他拥有的属性和行为都球员基类不一样。

     public class 外籍中锋
        {
            string name;
    
            public 外籍中锋(string name)
            {
                this.name = name;
            }
    
            public void 进攻()
            {
                Console.WriteLine("外籍中锋{0}进攻", name);
    
            }
    
            public void 防守()
            {
                Console.WriteLine("外籍中锋{0}防守", name);
            }
    
        }

    这个时候,翻译官就可以出来工作了。

    public class 翻译官:球员
       {
           private 外籍中锋 w;
           public 翻译官(string name) : base(name)
           {
               w = new 外籍中锋(name);
           }
        
           public override void Attack()
           {
               //翻译进攻命令
              w.进攻();
           }
    
           public override void Defense()
           {
               //翻译防守命令
               w.防守();
           }
        }

    最后,如何调用

     球员 a=new 前锋("前锋_巴蒂尔");
                a.Attack();
                //教练直接给翻译官下命令
                球员 b = new 翻译官("中锋_姚明");
                b.Attack();
                b.Defense();
                Console.Read();

    案例总结:我觉得适配器是一种后期弥补的模式,不能盲目的用。姚明去NBA打球,不需要立刻学会外语,教练通过下命令给翻译官,翻译官转达给姚明,姚明执行命令。其实,这样的做法,必须依赖翻译官,最好方式就是姚明自己会外语,所以,适配器模式不能乱用,就像著名的扁鹊三兄弟的故事,如果前期设计好一点,事前能控制,而不是事后,经常改动。

    人生匆匆几十年,BeYourself...
  • 相关阅读:
    vue项目接入百度地图
    angularJS 十六进制与字符串相互转换
    angular项目实现mqtt的订阅与发布 ngx-mqtt
    消息中间件MQTT
    Zigbee 与 WiFi 的区别
    angular6 路由拼接查询参数如 ?id=1 并获取url参数
    SpringBoot拦截器
    SpringBoot定时任务
    SpringBoot 各层之间的关系
    百度离线地图 —— 瓦片地图下载
  • 原文地址:https://www.cnblogs.com/huagege/p/7562859.html
Copyright © 2020-2023  润新知