CS-Notes全部笔记在阅读器中打开

1. 适配器(Adapter)

意图

把一个类接口转换成另一个用户需要的接口。

意图的配图

类图

类图的配图

实现

鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,Duck 的叫声调用 quack() 方法,而 Turkey 调用 gobble() 方法。

要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充鸭子。

public interface Duck {
    void quack();
}
public interface Turkey {
    void gobble();
}
public class WildTurkey implements Turkey {
    @Override
    public void gobble() {
        System.out.println("gobble!");
    }
}
public class TurkeyAdapter implements Duck {
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }
}
public class Client {
    public static void main(String[] args) {
        Turkey turkey = new WildTurkey();
        Duck duck = new TurkeyAdapter(turkey);
        duck.quack();
    }
}
gobble!

适配器和装饰都包装另一个对象,区别在于接口:适配器把被包装对象的接口转换成客户端需要的另一个接口(gobble() 变成 quack()),装饰保持接口不变,只叠加功能。

JDK 中的应用

Java I/O 中,InputStreamReader 是适配器:它是一个 Reader,内部的解码器从 InputStream 读出字节并解码成字符,让字节流可以当作字符流使用。

参考资料

在阅读器中可以用目录和搜索、切换深色模式、练习这篇笔记中的面试题:打开《设计模式 - 适配器》