适配器模式:
作为不兼容接口之间调用的桥梁;
将一个类的接口转换成客户希望的另外一个接口;
使用场景:
当调用双方都不太容易修改的时候,为了复用现有组件可以使用适配器模式;在系统中接入第三方组
件的时候经常被使用到;
适配器模式经典案例:
-
一个客户(系统)的支付接口需要调用第三方支付功能;
适配器模式图.png
第三方支付有支付宝,微信,银联等。不同的支付有不同的接口;
这时需要一个适配器做接口转换;如图(图1)
(每种第三方服务对应一个适配器,而不是用一个大的适配器,因为后续可能会增加第三方服务,为了遵循开闭原则,所以每增加一个第三方服务都对应增加一个适配器。)
-
MyBatis 日志级别的转换;
mybatis 中日志级别有四个: trace , debug ,info ,warn , error;
系统本身接入的第三方日志系统,比如说sfl4J,Log4J2,Log4J,JdkLog
这些第三方的日志级别都不一样,系统希望能将这些第三方的服务日志级别都转换成统一的四个级别。
适配器实现的要素:
适配器需要实现和目标角色的接口;
适配器要依赖适配者角色的接口;
(一定要面向接口依赖)。
Target:目标角色,期待得到的接口. (系统定义的日志接口)
Adaptee:适配者角色,被适配的接口. (第三方日志接口)
Adapter:适配器角色,将源接口转换成目标接口。
日志适配器具体代码:
import java.util.logging.Level;
//jdk日志的适配器 实现mybatis自己的日志接口-Log
public class Jdk14LoggingImpl implement Log{
//依赖真正提供日志能力的jdk日志类,此处面向接口依赖
private final Logger log;
//提供构造器注入方式
public Jdk14LoggingImpl(String clazz){
log = Logger.getLogger();
}
//如果系统调用本身的error级别,则这里会转换成调用jdk的SERVER级别
@Override
public void error(String s){
log.log(Level.SERVER,s)
}
}
网友评论