适配器模式

适配器模式(Adapter模式)属于结构型模式的一种。

将一个类的接口转换成我们希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,就是适配器。适配器模式旨在解决不同接口之间的兼容性问题。

现在很多笔记本电脑有Type-C的接口,但是你的U盘插不上Type-C的接口,网上很多卖Type-C转USB的转接头,这个转接头就是适配器。

适配器模式在Java标准库中有很多应用。比如InputStreamReader、OutputStreamWriter,将对应的流适配为Reader、Writer。

适配器模式可以将一个接口1转换为接口2,使得新的对象符合接口2规范。编写适配器实际上就是编写一个实现了接口2,且内部持有接口1的类,在内部将接口2的调用“转换”为对接口1的调用。接口均为抽象接口时,才能简单地实现适配器模式。

适配器模式通常有以下组成部分

  • 目标接口:客户端所期待的接口,适配器需要实现这个接口。
  • 源接口:需要被适配的现有接口,通常不满足客户端的现有要求。
  • 适配器:实现目标接口并持有源接口的实例,通过将源接口的功能转换为目标接口的功能,来实现兼容性。

使用适配器模式将一个旧的电源接口适配为新的设备接口。

1、目标接口

// 目标接口
interface Target {
    void request();
}

2、源接口

// 源接口
class Adaptee {
    public void specificRequest() {
        System.out.println("Called specificRequest from Adaptee");
    }
}

3、适配器

// 适配器
class Adapter implements Target {
    private Adaptee adaptee;

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

    @Override
    public void request() {
        System.out.println("Adapter: Translating request...");
        adaptee.specificRequest(); // 转发请求
    }
}

4、客户端

// 客户端
public class Main {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.request(); // 客户端只与目标接口交互
    }
}

适配器模式的优缺点

优点:

  • 提高兼容性:适配器模式可以让不兼容的接口一起工作,使得系统中的组件能够更好地协同工作。
  • 灵活扩展性:通过适配器,可以在不修改源接口的情况下,增加新的功能或对接新的系统,从而提高了系统的扩展性。
  • 封装:适配器将源接口的实现细节封装起来,客户端只需与目标接口交互,简化了客户端代码。
  • 复用已有代码:可以将现有的类通过适配器进行复用,而无需对其进行修改。

缺点:

  • 增加复杂性:使系统结构变得更复杂,尤其是在有多个适配器和源接口的情况下,可能会使得代码难以理解和维护。
  • 不易调试:增加了额外的适配器层,调试时可能会使问题定位变得困难。
  • 过度适配:在某些情况下,可能会为了适配不必要的接口而创建过多的适配器,导致设计不够简洁。

适配器有对象适配器、类适配器。对象适配器适合需要适配多个不同类型的源类时,或者当源类可能会发生变化时。类适配器适合简单一些的情况,比如在源类不频繁变化且只需适配少量接口时。类适配器使用了继承机制,如果适配器需要同时继承多个对象的接口的话,在Java中则不适合此类适配器,因为Java是单继承。此种情况需在支持多重继承的编程语言中实现,例如 C++。类适配器不需要封装任何对象,因为它同时继承两边的行为。

在SpringMVC源码中的 HandlerAdapter 就使用了适配器模式。

有时甚至可以创建一个双向适配器来实现双向转换调用。

适配器模式在软件设计中很常见,特别是在需要整合旧系统与新系统或第三方库时。通过适配器模式,我们可以在保持代码清晰和易于管理的同时,充分利用已有的组件和类。

静下心来,脚踏实地,日复一日的练习、积累,一点点的突破和改善。--  烟沙九洲

 
 
posted @ 2024-11-27 20:43  烟沙九洲  阅读(15)  评论(0编辑  收藏  举报  来源