定义
适配器模式将一个类的接口转换成客户端期望的另一种接口,充当中间桥梁的角色。
结构
适用场景
适配器模式适用于以下典型场景:
1)复用遗留代码或第三方库
当系统需集成现有类,但其接口不符合当前需求,且无法直接修改源码时。例如:整合旧系统功能模块到新框架中;调用第三方库时接口不兼容。
2)统一多个类的接口
需协调多个功能类似但接口不同的类,提供统一调用入口。例如:不同数据库驱动(如JDBC)通过适配器提供统一访问接口;封装多个零散功能类,提供标准化操作。
3)兼容不同环境或设备硬件或协议转换场景。
例如:读卡器适配多种存储卡格式;充电器转换插头规格(如三插转二插)。
4)扩展系统灵活性
为未来可能引入的不兼容类预留接口适配能力,避免频繁修改核心代码。
使用示例
这里以日志框架为例,来简单说明适配器模式的使用方式。
定义目标接口
/**
* 目标接口(类似SLF4J的Logger接口)
*/
public interface Logger {
void log(String msg);
}
定义被适配对象
/**
* 被适配者A:Log4j实现
*/
public class Log4jLogger {
public void log4jLog(String msg) {
System.out.println("[Log4j] " + msg);
}
}
/**
* 被适配者B:JUL实现
*/
public class JULLogger {
public void julLog(String msg) {
System.out.println("[JUL] " + msg);
}
}
定义适配器
/**
* 适配器A:Log4j适配器
* 对象适配器方式,如果是类适配器直接继承 Log4jLogger,调用super.log4jLog(msg)即可。
*/
public class Log4jAdapter implements Logger{
private final Log4jLogger log4j;
public Log4jAdapter(Log4jLogger log4j) {
this.log4j = log4j;
}
@Override
public void log(String msg) {
log4j.log4jLog(msg);
}
}
/**
* 适配器B:JUL适配器
* 类适配器
*/
public class JULAdapter extends JULLogger implements Logger {
@Override
public void log(String message) {
super.julLog(message);
}
}
测试
public class Client {
public static void main(String[] args) {
Logger log = new Log4jAdapter(new Log4jLogger());
log.log("通过对象适配器实现。");
Logger log2 = new JULAdapter();
log2.log("通过类适配器实现。");
}
}