了解适配器模式

发布于:2025-04-07 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

适配器模式定义

 适配器模式角色

适配器模式的实现

适配器的应用场景


适配器模式定义

适配器模式,也叫包装模式。将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。

简单来说就是目标类不能直接使用,通过一个新类进行包装一下,适配器调用方使用。把两个不兼容的接口通过一定的方式使之兼容。

比如下面两个接口,本身不兼容的(参数类型不一样,参数个数不一样等等)。

 可以通过适配器的方式,使之兼容。


 

 适配器模式角色

  • Target:目标接口(可以是抽象类或接口),客户希望直接使用的接口。
  • Adaptee:适配者,但是与Target不兼容。
  • Adapter:适配类,此模式的核心,通过继承或者引用适配者的对象,把适配器转为目标接口。
  • client:需要使用适配器的对象。

适配器模式的实现

场景:其中slf4j就使用了适配器模式,slf4j提供了一系列打印日志的api,底层调用的是log4j或者logback来打印日志,我们作为调用者,只需要调用slf4j的api就行了。

  • slf4j接⼝
public interface Slf4jApi {
    void log(String message);
}
  • log4j “接口”
public class Log4j {
    void log(String message) {
        System.out.println("Log4j日志打印:"+message);
    }
}
  • slf4j和log4j适配器
public class Slf4jLog4jAdapter implements Slf4jApi {
    private Log4j log4j;

    public Slf4jLog4jAdapter(Log4j log4j) {
        this.log4j = log4j;
    }

    @Override
    public void log(String message) {
        log4j.log(message);
    }
}
  • 客⼾端调⽤
public class Main {
    public static void main(String[] args) {
        Slf4jLog4jAdapter slf4jLog4jAdapter = new Slf4jLog4jAdapter(new Log4j());
        slf4jLog4jAdapter.log("使用slf4j打印日志");
    }
}

可以看出,我们不需要改变log4j的api,只需要通过适配器转换下,就可以更换日志框架,保障系统的平稳运行。


 

适配器的应用场景

一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷,应用这种模式算是“无奈之举”。

所以适配器模式更多的应用场景主要是对正在运行的代码进行改造,并且希望可以复用原有的代码实现新的功能,比如版本升级。