解决问题
所谓适配器模式,类似于电脑的各种端口,例如USB,只要实现了USB协议的终端都可以在电脑上使用,只需要提供相应的驱动(Adaptor)即可。Adaptor的目的就是屏蔽各种差异,使核心业务不受输入输出的影响。
它主要是解决代码耦合的问题,使业务之间能够很好的隔离;核心业务代码可以更加集中的管理,并可以使用适配器供多种类型的客户端调用。
应用场景
业务隔离或一个核心业务需要提供给多种不同类型的客户端。比较有名的例子是:“六边形架构”,它很好地使用adaptor将输入输出与信心业务相隔离。
也有可能是返过来的一种情况,多种核心业务需要根据参数调整业务逻辑,使这种业务逻辑对外不可见。
原理图
image- Target 对外接口
- Adapter 适配器,屏蔽内外差异
- Adaptee 被适合的角色
示例
一个在工作中会经常遇到的问题:我们有一个业务,比如展示用户信息。它既需要在APP上展示(http/https)接口;公司的其它也需要用这个信息,则需要为内部提供一个接口(通常是RPC,比如thrift),我们这里采用一个适配器来解决这个问题。
public interface UserInfo<T, R> {
public T getUserInfo(R request);
}
public class UserCoreBussiness {
public UserCoreResponse getUserInfo() {
return new UserCoreResponse();
}
public static class UserCoreRequest {
}
public static class UserCoreResponse {
}
}
public class HttpAdaptor implements UserInfo<String, HttpServletRequest> {
@Override
public String getUserInfo(HttpServletRequest request) {
// HttpServletRequest 转换成核心请求参数
this.buildRequest(request);
UserCoreBussiness.UserCoreResponse response = new UserCoreBussiness().getUserInfo();
return this.changeResponse(response);
}
private UserCoreBussiness.UserCoreRequest buildRequest(HttpServletRequest request) {
return new UserCoreBussiness.UserCoreRequest();
}
private String changeResponse(UserCoreBussiness.UserCoreResponse response) {
return response.toString();
}
}
public class ThriftAdptor implements UserInfo<Object, Object> {
@Override
public Object getUserInfo(Object request) {
// HttpServletRequest 转换成核心请求参数
this.buildRequest(request);
// 核心业务
UserCoreBussiness.UserCoreResponse response = new UserCoreBussiness().getUserInfo();
// 转换成对应的输出
return this.changeResponse(response);
}
private UserCoreBussiness.UserCoreRequest buildRequest(Object request) {
return new UserCoreBussiness.UserCoreRequest();
}
private Object changeResponse(UserCoreBussiness.UserCoreResponse response) {
return new Object();
}
}
参考
网友评论