美文网首页
设计模式学习专栏六--------适配器模式

设计模式学习专栏六--------适配器模式

作者: 你的头发真的好长 | 来源:发表于2019-03-11 21:53 被阅读0次

    设计模式学习专栏六--------适配器模式

    场景


    如何让火鸡Turckey冒充鸭子Duck

    鸭子接口

    public interface Duck {
        public void quack();
        public void fly();
    }
    

    鸭子的实现类--绿头鸭

    public class MallardDuck implements Duck {
        public void quack() {
            System.out.println("Quack");
        }
     
        public void fly() {
            System.out.println("I'm flying");
        }
    }
    

    火鸡接口

    public interface Turkey {
        public void gobble();
        public void fly();
    }
    

    火鸡的实现类--野生火鸡

    public class WildTurkey implements Turkey {
        public void gobble() {
            System.out.println("Gobble gobble");
        }
     
        public void fly() {
            System.out.println("I'm flying a short distance");
        }
    }
    

    如何实现

    现在,我们缺少鸭子对象,需要用一些火鸡来冒充鸭子,显而易见,因为火鸡的接口不同,所以不能公然拿来使用

    • 创建我们的火鸡适配器

      image

      测试代码

      public class DuckTestDrive {
        public static void main(String[] args) {
            MallardDuck duck = new MallardDuck();
      
            WildTurkey turkey = new WildTurkey();
            Duck turkeyAdapter = new TurkeyAdapter(turkey);
      
            System.out.println("The Turkey says...");
            turkey.gobble();
            turkey.fly();
      
            System.out.println("\nThe Duck says...");
            testDuck(duck);
      
            System.out.println("\nThe TurkeyAdapter says...");
            testDuck(turkeyAdapter);
        }
      
        static void testDuck(Duck duck) {
            duck.quack();
            duck.fly();
        }
      }
      

      测试结果

      The Turkey says...
      Gobble gobble
      I'm flying a short distance
      
      The Duck says...
      Quack
      I'm flying
      
      The TurkeyAdapter says...
      Gobble gobble
      I'm flying a short distance
      I'm flying a short distance
      I'm flying a short distance
      I'm flying a short distance
      I'm flying a short distance
      

    客户使用适配器的过程

    • 客户通过目标接口调用适配器的方法对适配器发出请求
    • 适配器使用 被适配者接口 把 请求转换成 被适配者的一个或多个调用接口
    • 客户接收到 调用的结果,但并未察觉这一切是适配器在起转换作用

    客户和被适配者是解耦的, 它们互相不知道对方的存在

    适配器模式总览


    定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间

    • 类图
    image
    • 模式的理解

      • 角色

        • 目标接口
        • 被适配者
        • 适配器
      • 两种适配器的存在

        • 类适配器

          • 类图

            image
        • 对象适配器

        • 两者的比较

          • 对象适配器使用组合来适配被适配者 , 类适配器使用 继承来适配被适配者
          • 类适配器 有 多重继承的问题
          • 对象适配器能够 切换不同的被适配者 , 在运行中也可以.而类适配器只能采用特定的被适配类
    • 真实世界的迭代器

      • 枚举(Enumeration)和迭代器(Iterator)

        • 类图设计 : 在面对遗留代码中 , 如何让迭代器 代替 枚举器接口?

          image
        • 适配器代码

          public class EnumerationIterator implements Iterator<Object> {
            Enumeration<?> enumeration;
           
            public EnumerationIterator(Enumeration<?> enumeration) {
                this.enumeration = enumeration;
            }
           
            public boolean hasNext() {
                return enumeration.hasMoreElements();
            }
           
            public Object next() {
                return enumeration.nextElement();
            }
           
            public void remove() {
                throw new UnsupportedOperationException();
            }
          }
          
          

    参考

    ​ 书籍: HeadFirst设计模式

    ​ 代码参考地址: 我就是那个地址

    相关文章

      网友评论

          本文标题:设计模式学习专栏六--------适配器模式

          本文链接:https://www.haomeiwen.com/subject/dxiipqtx.html