[TOC]
1. 定义
适配器模式是指将一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作
2. 适用场景
- 已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况
- 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
3. 代码实现
3.1 原接口类
package com.zhunongyun.toalibaba.designpatterns.adapter.poweradapter;
public class AC220 {
public int outputAC220() {
int output = 220;
System.out.println("输出电压" + output + "V");
return output;
}
}
3.2 适配器类
public interface DC5 {
/**
* 输出5V电压
* @return
*/
int outputDC5();
}
package com.zhunongyun.toalibaba.designpatterns.adapter.poweradapter;
public class PowerAdapter implements DC5 {
private AC220 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
/**
* 输出5V电压
*
* @return
*/
@Override
public int outputDC5() {
int adapterInput = ac220.outputAC220();
int adapterOutput = adapterInput / 44;
System.out.println("使用PowerAdapter将输入AC: " + adapterInput + "V, 输出DC: " + adapterOutput + "V");
return adapterOutput;
}
}
3.3 测试类
package com.zhunongyun.toalibaba.designpatterns.adapter.poweradapter;
public class PowerAdapterTest {
public static void main(String[] args) {
DC5 dc5 = new PowerAdapter(new AC220());
dc5.outputDC5();
}
}
4. 源码分析
4.1 Spring的HandlerAdapter
五个实现类
- AbstractHandlerMethodAdapter
- SimpleControllerHandlerAdapter
- HttpRequestHandlerAdapter
- SimpleServletHandlerAdapter
- RequestMappingHandlerAdapter
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
public interface HandlerAdapter {
boolean supports(Object var1);
@Nullable
ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
long getLastModified(HttpServletRequest var1, Object var2);
}
5. 优缺点
5.1 优点
- 能提高类的透明性和复用,现有的类复用但不需要改变
- 目标类和适配器类解耦,提高程序的扩展性
- 在很多业务场景中符合开闭原则
5.2 缺点
- 适配器编写过程需要全面考虑,可能会增加系统的复杂性
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱