适配器模式(Adapter Pattern)是一种设计模式,它就像我们日常用的电源插头转换器:如果你有一个圆孔的插座(目标接口),但手头是扁插头的电器(现有类),那么需要一个转换器(适配器)把扁插头转成圆插头,让电器能正常通电。
在代码中,适配器模式的作用是让两个接口不兼容的类能够一起工作。它通过创建一个中间类(适配器),将现有类的接口转换成客户端期望的另一个接口。
适配器模式角色如下:
- Target:目标接口 (可以是抽象类或接口), 客户希望直接用的接口
- Adaptee:适配者,但是与Target不兼容
- Adapter:适配器类, 此模式的核心,通过继承或者引⽤适配者的对象,把适配者转为目标接口
- client:需要使⽤适配器的对象
有下面的代码,目标接口为Slf4jApi,这是客户端(Slf4jDemo)希望使用的日志接口,它有一个 log 方法
java
interface Slf4jApi {
void log(String message);
}
这是一个现有的日志类,但它提供的日志方法名叫 log4jLog,与目标接口的 log 不匹配
java
class Log4j {
void log4jLog(String message) {
System.out.println("Log4j打印:" + message);
}
}
此时设置适配器 Slf4jLog4JAdapter,它实现了目标接口 Slf4jApi,所以客户端可以把它当作 Slf4jApi 来使用。Log4j 对象通过构造函数的方式传入,
java
class Slf4jLog4JAdapter implements Slf4jApi {
private Log4j log4j;
public Slf4jLog4JAdapter(Log4j log4j) {
this.log4j = log4j;
}
@Override
public void log(String message) {
log4j.log4jLog(message); // 把调用转发给适配者
}
}
客户端的代码如下,当客户端调用适配器的 log 方法时,适配器会调用内部 log4j 对象的 log4jLog 方法,完成从 log 到 log4jLog 的转换
java
public class Slf4jDemo {
public static void main(String[] args) {
Slf4jApi slf4jApi = new Slf4jLog4JAdapter(new Log4j());
slf4jApi.log("使用slf4j打印日志");
}
}