2.1 适配器模式
适配器模式(Adapter)解决一个非常具体的现实问题:两段代码本该协作,接口却对不上。 你有一个现成的类(或第三方库、遗留系统),功能正合适,但它暴露的方法名、参数、返回值和你的客户端期望的接口不一致。适配器在中间做“翻译”,让双方都不必改动。
最朴素的类比是出国旅行带的电源转换头:笔记本的插头没变,墙上的插座没变,转换头在中间处理形状,必要时还要处理电压这样的真实约束。
正在加载交互实验...
对象适配器 vs 类适配器
适配器有两种实现路径:
- 对象适配器(推荐):适配器内部组合一个被适配对象,把请求转发过去。灵活,不受继承限制,可以适配一整族子类。
- 类适配器:适配器通过继承同时继承目标接口和被适配类(需要语言支持多继承,Java 中只能继承一个类)。
java
// 对象适配器:组合
class MediaAdapter implements MediaPlayer {
private AdvancedPlayer advanced; // 持有被适配者
public void play(String type, String file) {
if (type.equals("mp4")) advanced.playMp4(file); // 翻译
else if (type.equals("vlc")) advanced.playVlc(file);
}
}下面的播放器适配器实验更像一次插线测试:App 只有一个 play(file) 按钮,旧播放器却只有 playMp3()、playMp4()、playVlc() 这些老按钮。插上适配器,它就能帮 App 按对按钮。
正在加载交互实验...
正在加载概念检查...
适配器不是借口
适配器是兼容层,它的价值在于隔离不兼容。但要警惕:
- 如果你能直接改被适配的代码,而且它确实设计得不好,那应该去改它,而不是永远糊一层适配器。
- 适配器里只做接口翻译,不要塞业务逻辑。一旦适配器开始做计算、校验、状态管理,它就变质成了一个偷偷长大的中间层。
正在加载概念检查...
正在加载本节练习...