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

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

 

场景


如何让火鸡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");
    }
}

 

 

如何实现

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

  • 创建我们的火鸡适配器

    测试代码

    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

     

 

客户使用适配器的过程

  • 客户通过目标接口调用适配器的方法对适配器发出请求

  • 适配器使用 被适配者接口 把 请求转换成 被适配者的一个或多个调用接口

  • 客户接收到 调用的结果,但并未察觉这一切是适配器在起转换作用

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

 

适配器模式总览


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

  • 类图

  • 模式的理解

    • 角色

      • 目标接口

      • 被适配者

      • 适配器

    • 两种适配器的存在

      • 类适配器

        • 类图

      • 对象适配器

      • 两者的比较

        • 对象适配器使用组合来适配被适配者 , 类适配器使用 继承来适配被适配者

        • 类适配器 有 多重继承的问题

        • 对象适配器能够 切换不同的被适配者 , 在运行中也可以.而类适配器只能采用特定的被适配类

  • 真实世界的迭代器

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

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

      • 适配器代码

        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设计模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值