定义:适配器模式又叫变压器模式。它的功能是将一个类的接口变成客户端所期待的另一个类的接口,从而使原本因接口不匹配而无法一起工作的两个类可以一起工作。属于结构型设计模式。
生活中的适配器应用:手机充电器、插电板转接、显示器转接头
适配器适用场景:
- 已经存在的类,它的方法和需求不匹配,但是方法的结果相同或者相似的情况。
- 适配器模式不是软件设计阶段考虑的设计模式,而是随着软件维护,由于不同产品、不同厂家造成功能类似但是接口不相同情况下的解决方案。
适配器的优点:
- 能提高类的透明性和复用性,现有的类可以复用但不用改变
- 目标类和适配器类解耦,提高了程序的可扩展性
- 在很多业务场景中符合开闭原则
适配器的缺点:
- 适配器编写过程中需要全面考虑,会增加系统的复杂度
- 增加了代码的阅读难度,降低了代码的可读性,过多使用适配器会使系统代码变得凌乱
类适配器
ClassAdapter extends ExistingClass implements Target,违背了最少知道原则
// 已有类
public class AC220 {
public int outputAC220() {
int output = 220;
System.out.println("输出220V电压");
return output;
}
}
// 新业务需求添加的接口类
public interface DC5 {
public int outputDC5();
}
// 适配器类:继承已有类,实现定义的新业务需求接口
public class PowerAdapter extends AC220 implements DC5 {
@Override
public int outputDC5() {
int adapterInput = super.outputAC220();
int adapterOutput = adapterInput / 44;
System.out.println("使用Adapter输入AC" + adapterInput + "V电压,输出DC" + adapterOutput);
return adapterOutput;
}
}
public class Test {
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter();
powerAdapter.outputDC5();
}
}
对象适配器
ObjectAdapter implements Target, 通过构造方法传入ExistingClass并使用,遵循最少知道原则
public class AC220 {
public int outputAC220() {
int output = 220;
System.out.println("输出220V电压");
return output;
}
}
public interface DC5 {
public int outputDC5();
}
// 适配器类:实现定义的新业务需求接口,通过构造方法传入已有类,从而使用已有类中的方法
public class PowerAdapter implements DC5 {
private AC220 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
@Override
public int outputDC5() {
int adapterInput = ac220.outputAC220();
int adapterOutput = adapterInput / 44;
System.out.println("使用Adapter输入AC" + adapterInput + "V电压,输出DC" + adapterOutput);
return adapterOutput;
}
}
public class Test {
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter(new AC220());
powerAdapter.outputDC5();
}
}
接口适配器
关注点在于解决接口方法过多的问题
public class AC220 {
public int outputAC220() {
int output = 220;
System.out.println("输出220V电压");
return output;
}
}
public interface DC {
public int outputDC5();
public int outputDC12();
public int outputDC24();
}
public class PowerAdapter implements DC {
private AC220 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
@Override
public int outputDC5() {
int adapterInput = ac220.outputAC220();
int adapterOutput = adapterInput / 44;
System.out.println("使用Adapter输入AC" + adapterInput + "V电压,输出DC" + adapterOutput);
return adapterOutput;
}
@Override
public int outputDC12() {
return 0;
}
@Override
public int outputDC24() {
return 0;
}
}
public class Test {
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter(new AC220());
powerAdapter.outputDC5();
powerAdapter.outputDC12();
powerAdapter.outputDC24();
}
}
适配器模式在Spring中的应用
Spring中处理通知Advice的适配器
public interface AdvisorAdapter {
boolean supportsAdvice(Advice var1);
MethodInterceptor getInterceptor(Advisor var1);
}
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
MethodBeforeAdviceAdapter() {}
public boolean supportsAdvice(Advice advice) {
return advice instanceof MethodBeforeAdvice;
}
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice)advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
}
}
class AfterReturningAdviceAdapter implements AdvisorAdapter, Serializable {
AfterReturningAdviceAdapter() {}
public boolean supportsAdvice(Advice advice) {
return advice instanceof AfterReturningAdvice;
}
public MethodInterceptor getInterceptor(Advisor advisor) {
AfterReturningAdvice advice = (AfterReturningAdvice)advisor.getAdvice();
return new AfterReturningAdviceInterceptor(advice);
}
}
class ThrowsAdviceAdapter implements AdvisorAdapter, Serializable {
ThrowsAdviceAdapter() {}
public boolean supportsAdvice(Advice advice) {
return advice instanceof ThrowsAdvice;
}
public MethodInterceptor getInterceptor(Advisor advisor) {
return new ThrowsAdviceInterceptor(advisor.getAdvice());
}
}
public interface Advice {}
public interface BeforeAdvice extends Advice {}
public interface MethodBeforeAdvice extends BeforeAdvice {
void before(Method var1, Object[] var2, @Nullable Object var3) throws Throwable;
}
public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {
private final MethodBeforeAdvice advice;
public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
Assert.notNull(advice, "Advice must not be null");
this.advice = advice;
}
@Nullable
public Object invoke(MethodInvocation mi) throws Throwable {
this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
return mi.proceed();
}
}
SpringMVC中处理请求的适配器
public class DispatcherServlet extends FrameworkServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
ModelAndView mv = null;
processedRequest = this.checkMultipart(request);
// 根据request请求中的url获取handler
mappedHandler = this.getHandler(processedRequest);
// 根据handler获取适配器Adapter
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
// 通过对应的Adapter处理请求
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
}
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
Iterator var2 = this.handlerMappings.iterator();
while(var2.hasNext()) {
HandlerMapping mapping = (HandlerMapping)var2.next();
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
Iterator var2 = this.handlerAdapters.iterator();
while(var2.hasNext()) {
HandlerAdapter adapter = (HandlerAdapter)var2.next();
if (adapter.supports(handler)) {
return adapter;
}
}
}
}
}
public interface HandlerAdapter {
boolean supports(Object var1);
@Nullable
ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
long getLastModified(HttpServletRequest var1, Object var2);
}
public class HttpRequestHandlerAdapter implements HandlerAdapter {
public HttpRequestHandlerAdapter() {
}
public boolean supports(Object handler) {
return handler instanceof HttpRequestHandler;
}
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
((HttpRequestHandler)handler).handleRequest(request, response);
return null;
}
public long getLastModified(HttpServletRequest request, Object handler) {
return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -1L;
}
}
@FunctionalInterface
public interface HttpRequestHandler {
void handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws ServletException, IOException;
}
public class ResourceHttpRequestHandler extends WebContentGenerator implements HttpRequestHandler, EmbeddedValueResolverAware, InitializingBean, CorsConfigurationSource {
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
}
}