设计模式——适配器模式
目录
- 设计模式——适配器模式
- 介绍
- 实现
- 结构
- 类适配器模式(通过继承)
- 对象适配器模式(通过委托)
- 优缺点
- 使用场景
- 总结
介绍
适配器模式(Adapter Pattern)
是一种结构型设计模式,目的是将一个类的接口转换成客户端所期望的另一个接口。适配器模式让原本接口不兼容的类可以一起工作。
简单来说,适配器模式就是提供一个中介者,使得两个原本不能直接交互的接口可以通过适配器实现兼容和交互。
就像不同国家的插座标准一样,比如说,欧洲国家的插座标准不能满足中式插头电器的正常使用,那么就需要一个欧转中的转换头,使得中式插头的电器可以正常使用。适配器就是这个道理
实现
结构
在适配器模式中,涉及到以下几个角色:
- 目标接口(Target):客户端所期待的接口,适配器将要将其适配成这个接口。
- 客户端(Client):使用目标接口的类,通常是调用方。
- 源接口(Adaptee):需要适配的现有接口。
- 适配器(Adapter):实现目标接口,内部持有一个源接口实例并将其转换成目标接口需要的形式。
类适配器模式(通过继承)
类适配器模式通过继承源类来适配目标接口。这种方式会导致适配器必须继承源类,所以适配器类无法继承其他类。
示例代码:
// 目标接口(客户端期望的接口)
interface Target {void request();
}// 源接口(需要被适配的接口)
class Adaptee {public void specificRequest() {System.out.println("Specific request.");}
}// 适配器(继承自Adaptee类并实现Target接口)
class Adapter extends Adaptee implements Target {@Overridepublic void request() {specificRequest(); // 调用源类的方法}
}// 客户端
public class Client {public static void main(String[] args) {Target target = new Adapter(); // 客户端通过目标接口来使用target.request(); // 输出: Specific request.}
}
简单解释一下,我们需要将现有接口specificRequest()
适配成 request()
,也就是说,客户端希望通过调用 request()
方法来达到调用specificRequest()
方法,通过以上类的继承与实现,可以轻松解决这个需求
对象适配器模式(通过委托)
对象适配器模式通过持有一个源类的实例并调用该实例的相应方法来实现适配。这样适配器类可以继承自其他类。
示例代码:
-
目标接口(客户端期望的接口)
// 目标接口(客户端期望的接口) interface Target {void request(); }
-
源接口(需要被适配的接口)
// 源接口(需要被适配的接口) class Adaptee {public void specificRequest() {System.out.println("Specific request.");} }
-
适配器
// 适配器(通过持有Adaptee实例来适配) class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest(); // 委托给Adaptee实例} }
-
客户端(测试代码)
// 客户端 public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee); // 客户端通过目标接口来使用target.request(); // 输出: Specific request.} }
简单解释一下,这里适配器通过持有一个源接口的实例,来实现解除类适配器模式
中的继承关系,其在正常保证适配器的功能的前提下,增强了适配器的扩展性
优缺点
优点:
- 解耦:客户端与源类之间的依赖被适配器解耦,客户端只关心目标接口,不关心源类的实现细节。
- 提高复用性:可以将已有类的功能适配到新接口,使其复用性更强。
- 灵活性高:适配器模式提供了灵活的适配方式,既可以通过继承也可以通过组合来实现。
缺点:
- 增加系统复杂性:引入适配器可能导致系统结构更为复杂,尤其是在大量使用适配器的情况下。
- 性能开销:适配器需要转发方法调用,可能导致一定的性能开销,尤其是在高频调用的场景中。
使用场景
适配器模式通常在以下情况中使用:
- 你希望复用一个已有的类,但它的接口不符合你所需要的。
- 你需要将一个类的接口转换成你所期望的接口。
- 类之间存在较大的接口差异,你希望通过一个中间层来解决。
例如:当你使用一个已有的库,但这个库的接口和你现有的代码不兼容时,适配器模式就非常适用。
总结
适配器模式是一种常见的设计模式,它通过在不同接口之间提供一个桥梁,使得不兼容的接口能够协同工作。其常见用途包括适配第三方库、系统重构时对旧代码的兼容等场景。适配器模式的核心思想就是将客户端的期望接口和源类的实际接口解耦,让它们能够顺利交互。通过使用适配器模式,可以在不改变现有代码的基础上使不同系统组件协同工作,提高系统的灵活性和可维护性。