目录
领域驱动设计之防腐层(Anti-corruption layer)
what什么是适配器模式
GOF定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(Gof里面说这个别名是Wrapper模式,这里和装饰器模式容易混淆,因为装饰器也可以说是Wrapper)
HeadFirst定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
why为什么需要适配器模式
这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。者可以让客户从实现的接口解耦。如果在一段时间之后,我们想改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。
这个模式是让客户和接口绑定起来,而不说和实现绑定起来。我们可以多个适配器,每一个都负责转换不同组的后台类。
适配器模式的思想也延伸到方方面面,我们买苹果产品,欧洲和中国的插座不一样,就需要买一个转换头,这是典型的适配器场景,也是很多介绍适配器文章的经典例子。在往设计领域思考,领域驱动设计里面提到的防腐层,其实也是适配器的思想。
how怎么实现适配器模式
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器模式
对象适配器模式
类适配器和对象适配器对比
这里引用HeadFirst里面的原话
开源框架经典案例
Dubbo之LoggerAdapter
日志框架何其多,每个公司甚至每个项目组估计都有一个自己的logger,为了适配不同的日志框架,dubbo中定义了自己的Logger接口,接口代码如下。同时新增了LoggerAdapter是适配不同的日志框架,该LoggerAdapter也标注了SPI注解,因此在引入dubbo後可根据项目按需配置,这是标准的不能再标准的适配器模式。
定义自己的Logger接口
package org.apache.dubbo.common.logger;
/**
* Logger interface
* <p>
* This interface is referred from commons-logging
*/
public interface Logger {
/**
* Logs a message with trace log level.
*
* @param msg log this message
*/
void trace(String msg);
/**
* Logs an error with trace log level.
*
* @param e log this cause
*/
void trace(Throwable e);
/**
* Logs an error with trace log level.
*
* @param msg log this message
* @param e log this cause
*/
void trace(String msg, Throwable e);
.... 省略其他的方法
}
日志适配器接口,具体的适配逻辑由子类实现
@SPI
public interface LoggerAdapter {
/**
* Get a logger
*
* @param key the returned logger will be named after clazz
* @return logger
*/
Logger getLogger(Class<?> key);
/**
* Get a logger
*
* @param key the returned logger will be named afte