Skip to content

适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是将一个接口转换为客户端期望的另一个接口,使得原本不兼容的接口可以协同工作。适配器模式通常用于解决现有类的接口与需求接口不一致的问题,无需修改原有接口,通过适配器来达到复用的目的。适配器模式分为两种类型:对象适配器模式和类适配器模式。

类图

适配器模式

主要角色

  1. 目标(Target):这是客户所期待的接口,也就是适配器转换后的接口。客户通过这个接口与适配器交互,而不需要知道具体的实现细节。
  2. 适配者(Adaptee):适配者即需要被适配的 类或接口,拥有特定的接口,但是不符合客户端的需要。
  3. 适配器(Adapter):适配器是本模式的核心,它将适配者的接口转换为客户期望的目标接口。适配器可以是类结构,也可以是对象结构。

类适配器模式

在类适配器模式中,适配器继承自适配者类,并实现目标接口。这种方式利用多态性来达到适配的效果,但要求适配者必须是一个类,且Java等单继承语言中,这限制了适配器的进一步扩展,因为它不能再继承其他类。

对象适配器模式

对象适配器模式采用对象组合的方式,适配器包含一个适配者对象的引用,通过委托调用适配者的功能。这种方式更加灵活,因为适配器类可以同时使用多个不同的适配者类,而且可以在运行时动态改变行为。

适用场景

  • 当你想要使用一个已经存在的类,而它的接口不符合你的需求时。
  • 你想创建一个可复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它们的父类接口。
  • 双方不都太容易修改的时候在使用适配器模式适配

优缺点

优点:

  • 提高了系统的灵活性和可扩展性。
  • 使得原本不兼容的接口可以协同工作,增加了类的复用。
  • 符合开闭原则,可以在不修改原有系统的基础上增加新的行为。

缺点:

  • 过多使用适配器,会让系统代码结构复杂化,增加理解难度。
  • 使用对象适配器模式时,可能会增加额外的开销,因为适配器需要持有被适配者的引用。

示例

java
interface Target {
    void request();
}

class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee's specific request.");
    }
}

class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

public class AdapterDemo {
    public static void main(String[] args) {
        Target target = new Adapter(new Adaptee());
        target.request();
    }
}

Released under the MIT License.