目录
适配器模式定义
适配器模式,也叫包装模式。将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
简单来说就是目标类不能直接使用,通过一个新类进行包装一下,适配器调用方使用。把两个不兼容的接口通过一定的方式使之兼容。
比如下面两个接口,本身不兼容的(参数类型不一样,参数个数不一样等等)。
可以通过适配器的方式,使之兼容。
适配器模式角色
- 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,只需要通过适配器转换下,就可以更换日志框架,保障系统的平稳运行。
适配器的应用场景
一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷,应用这种模式算是“无奈之举”。
所以适配器模式更多的应用场景主要是对正在运行的代码进行改造,并且希望可以复用原有的代码实现新的功能,比如版本升级。