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

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

作者: 你的头发真的好长 | 来源:发表于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