23种设计模式系列目录
23种设计模式之单例模式(Singleton Pattern)
23种设计模式之适配器模式(Adapter Pattern)
23种设计模式之抽象工厂模式(Abstract Factory Pattern)
23种设计模式之装饰器模式(Decorator Pattern)
--------------------------------------------------------------------------------------------------------------------------
读完本篇文章将会了解以下问题
1. 适配器模式定义
2. 适配器模式代码实现
3. 适配器模式的优缺点分析
--------------------------------------------------------------------------------------------------------------------------
1. 适配器模式定义
适配器模式(Adapter)是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。举个例子,MyBatis日志模块定义了error、debug、trace、warn四个级别,但因为其需要对接其他的第三方日志组件对于日志级别的定义各不相同(比如Log4j定义的日志级别是fine、finer、finest、all),那么该如何将实现自不同接口的第三方日志级别转换为MyBatis内部定义好的日志级别呢?
2. 适配器模式代码实现
类图关系:
Log4jLog:Log4j日志级别接口
public interface Log4jLog {
void fine();
void finer();
void finest();
void all();
}
Log4jLogger:Log4j日志实现类
public class Log4jLogger implements Log4jLog{
@Override
public void fine() {
System.out.println("Log4j:fine");
}
@Override
public void finer() {
System.out.println("Log4j:finer");
}
@Override
public void finest() {
System.out.println("Log4j:finest");
}
@Override
public void all() {
System.out.println("Log4j:all");
}
}
MybatisLog:Mybatis日志级别接口
public interface MybatisLog {
void error(String s);
void debug(String s);
void trace(String s);
void warn(String s);
}
MybatisLogger:Mybatis日志实现类
public class MybatisLogger implements MybatisLog {
private final Log4jLogger log;
public MybatisLogger(Log4jLogger log) {
this.log = log;
}
@Override
public void error(String s) {
log.fine();
}
@Override
public void debug(String s) {
log.finer();
}
@Override
public void trace(String s) {
log.finest();
}
@Override
public void warn(String s) {
log.all();
}
}
run001:测试类
public class run001 {
public static void main(String[] args) {
MybatisLog mybatisLog = new MybatisLogger(new Log4jLogger());
mybatisLog.debug("debug");
mybatisLog.error("error");
mybatisLog.trace("trace");
mybatisLog.warn("warn");
}
}
执行结果:
Log4j:finer
Log4j:fine
Log4j:finest
Log4j:all
上述例子中的MybatisLogger类就可以看做是一个适配器类,Log4j和Mybatis各自拥有自己定义好的日志级别,而该适配器类的作用就是在Mybatis对接Log4j日志组件后,当调用Mybatis的debug级别的时候,实际是调用的Log4j的finer级别,借此实现适配器的功能。此demo是采用注入依赖的方式实现适配器模式,还可以考虑继承的方式实现。
3. 适配器模式的优缺点分析
适配器模式的优点:
1、将目标类和适配者类解耦。
2、提高了类的复用。
3、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
4、灵活性好,且符合开闭原则。
适配器模式的缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了B接口的实现。
2、Java不支持多继承,故一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。