# 简介

举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

适配器模式将一个类的接口转换成用户希望的另一个接口,它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

示例

# 实现

鸭子 (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();
    }
}

我们也可以看一下其他示例:

我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer 。默认情况下, AudioPlayer 可以播放 mp3 格式的音频文件。

我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。

我们想要让 AudioPlayer 播放其他格式的音频文件(在上面的例子中,其实就是火鸡冒充鸭子)。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter ,并使用 AdvancedMediaPlayer 对象来播放所需的格式。

体现在 UML 中即为

UML

# 参考

菜鸟教程:https://www.runoob.com/design-pattern/adapter-pattern.html

Java 全栈知识体系:https://pdai.tech/md/dev-spec/pattern/9_adapter.html