适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
目录
前言
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。在生活中我们也接触过,美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
一、适配模式的核心角色
- 目标(Target):这是客户端所期待的接口,也就是我们需要的接口,它定义了客户端使用的方法和功能。
- 适配者(Adaptee):这是我们想要使用的现有接口,但它与目标接口不兼容。适配者可以是任何接口或类,它提供了一些功能,但这些功能的接口不符合客户端的需求。
- 适配器(Adapter):这是适配器模式的核心角色。适配器是一个具体的类,它实现了目标接口并包含了对适配者对象的引用。适配器的作用是在其方法中调用适配者的相应功能,从而将适配者的接口转换为目标接口,使得客户端可以通过目标接口与适配者进行交互。
二、具体实现
1.目标Target类
代码如下(示例):
// 目标接口
interface Target {
void request();
}
2.适配者类
代码如下(示例):
// 适配者类
class Adaptee {
public void specificRequest() {
System.out.println("适配者中的业务逻辑");
}
}
3.适配器类
代码如下(示例):
// 适配器类
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
4.客户端调用
代码如下(示例):
// 客户端调用
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
在这个例子中,Target
是目标接口,Adaptee
是适配者类,Adapter
是适配器类。客户端通过调用target.request()
来使用适配者的功能,而不需要直接与适配者进行交互。适配器类Adapter
实现了目标接口Target
,并在其request()
方法中调用了适配者类Adaptee
的specificRequest()
方法,从而实现了适配者功能到目标接口的转换。
三、应用场景
1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
四、命令模式的优缺点
优点:
- 可扩展性:使用适配器模式可以增加系统的灵活性和可扩展性。在不修改原有代码的基础上,可以通过新增适配器来实现对新接口的支持。
- 兼容性:该模式允许已有功能正确但接口不匹配的类与用户的接口进行匹配,从而让用户能够间接调用该类的操作。
- 复用性:适配器模式有助于提高现有代码的复用率,特别是当需要整合第三方库或遗留系统中的功能时。
缺点:
- 增加复杂度:虽然增加了一层间接层,但这通常是必要的,以便实现不同接口之间的转换。
- 过度使用:在软件设计开发阶段一般不建议使用适配器模式,因为过度使用可能会导致系统结构变得复杂难懂。
- 维护成本:随着适配器数量的增加,维护成本可能会随之上升,特别是在对象适配器中,由于使用了委托机制,可能需要更多的维护工作。
总结
适配器模式是一种非常实用的设计模式,它允许我们将现有的接口转换为客户端期望的接口。这种模式在整合第三方库、封装遗留代码、实现兼容层等方面非常有用。通过适配器模式,我们可以使不兼容的接口能够一起工作,从而提高系统的灵活性和可维护性。