适配器设计模式--《Head first 设计模式》阅读笔记

什么适配器设计模式呢?

现在有接口A,客户类的请求这个接口。但是我们希望客户调用的是接口A和接口B,但是这个过程对客户类是透明的。需要造一个适配器,使由于接口不兼容而不能交互的类可以一起工作。

下面是实现的例子:

//鸭子接口
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();
        //让鸭子作出动作
        System.out.println("
The Duck says...");
        testDuck(duck);
        //让火鸡作出动作
        System.out.println("The Turkey says...");
        turkey.gobble();
        turkey.fly();
        /**这时候我想统一地用testDuck这个静态方法控制鸭子和火鸡
         * 于是我创造一个适配器来把火鸡嫁接到鸭子接口上去,但是这个过程对用户是透明的
         * 用户还是只调用鸭子的静态方法,实际打印的是火鸡的动作
         */
        Duck turkeyAdapter = new TurkeyAdapter(turkey);
        System.out.println("
The TurkeyAdapter says...");
        testDuck(turkeyAdapter);
    }
 
    static void testDuck(Duck duck) {
        duck.quack();
        duck.fly();
    }
}

补上适配器类:

public class TurkeyAdapter implements Duck {
    Turkey turkey;
 
    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }
    
    public void quack() {
        turkey.gobble();
    }
  
    public void fly() {
        for(int i=0; i < 5; i++) {
            turkey.fly();
        }
    }
}

总结:

客户认为他正在和鸭子沟通,目标是鸭子类,是客户在其上调用方法的类。通过扩展两个几口(鸭子和火鸡),适配器使得火鸡可以响应对鸭子的请求。或积累没有鸭子的方法,但是适配器可以将对鸭子方法调用,转接调用火鸡方法。

原文地址:https://www.cnblogs.com/cracker13/p/9471792.html