# 简介
举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
适配器模式将一个类的接口转换成用户希望的另一个接口,它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
# 实现
鸭子 (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
中即为
# 参考
菜鸟教程:https://www.runoob.com/design-pattern/adapter-pattern.html
Java 全栈知识体系:https://pdai.tech/md/dev-spec/pattern/9_adapter.html