目录
适配器模式概括
将一个类的接口转换为客户期望的另一个接口。适配器模式不是软件设计阶段考虑的模式,而是软件维护时要用到的模式。
适配器优点:1.能提高类的透明性和复用性,现有类的复用但不需要改变;2.目标类和适配器类解耦合,提高程序扩展性;3.符合开闭原则。
适配器缺点:适配器模式编写过程中需要全面的考虑,可能会增加系统的复杂性,代码更难读懂。
适配器模式的适用场景:新增业务对原有业务的改造。例如家用插座提高220V的电流,用作给电视冰箱、电视供电。新买的手机只能冲5V的电流,插座直冲显然不合适,这时候可以使用一个充电头将220V电转为5v电。
适配器模式使用案例
原有类
public class AC220 {
public int outPut(){
int AC220 = 200;
System.out.println("输出"+AC220+"V");
return AC220;
}
}
给客户提供的接口
public interface DC5 {
public static int DC5 = 5;
public int output();
}
适配类及测试方法
public class PowerAdapter extends AC220 implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int output() {
int originalNum = ac220.outPut();
//简化的转换器,目的是输出5V电流
int resultNum = originalNum/44;
System.out.println("适配器转换后的电压"+resultNum+"V");
return resultNum;
}
public static void main(String[] args) {
DC5 adapter = new PowerAdapter();
adapter.output();
}
}
这段代码很容易读懂,注意在DC5接口的时候其实是实例化了新写的适配器类。符合了适配器设计模式的适用场景。在不改变原有接口的情况下将接口转换为客户期望的另一个接口。
适配器模式在开源框架中的应用
位于org.springframework.web.servlet包中的DispatcherServlet是servlet接口的实现类,作用是处理请求并返回结果。在servlet容器接收到一个请求时,servlet容器会针对这个请求创建一个servletRequest和servletRespones对象,相应的处理方法会通过servletRequest中携带的参数对应处理请求,再通过servletRespones对象商城请求的响应结果。
DispatcherServlet类的doDispatch方法是处理请求的核心逻辑,截取部分内容如下
try {
//对请求做类型转换
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// 根据请求信息找到相应的Handler
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
// 根据handleru想你找相应的HandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
}
doDispatch方法就是客户的逻辑方法,HandlerAdapter是客户使用的接口,getHandlerAdapter方法就是找到一个和当前请求匹配的适配器类,找到getHandlerAdapter方法
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
}
getHandlerAdapter业务逻辑就是遍历所有的适配器来找到合适的适配器并返回,而某个适配器是否适用于当前的handler的判断逻辑封装在了具体适配器中。找HandlerAdapter类的继承类(快捷键ctrl+H)列表,这个列表中的类就是所有的适配器类
打开SimpleControllerHandlerAdapter这个类的supports来看一下
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
可以看出来只要handler属于Controller类型,就会返回SimpleControllerHandlerAdapter这个类。所以SimpleControllerHandlerAdapter这个类就是来处理普通的web请求的,我们常写的请求处理类上都会加一个@Controller注解,目的就是能被视为一个请求处理类。
此处适用适配器模式提高了处理请求的灵活性,如果没有支持适配器模式的话,要写很多if-else代码去判断类型,如果新加了处理类型还要修改源码,不符合开闭原则。
开源框架中使用了适配器模式的地方很多,除了介绍的实例外,还有处理对象和XML格式转化的XmlAdapter、处理通知的AdvisorAdapter、jpa中处理数据源的JpaVendorAdapter。内容较易读,可以结合适配器的特点进行分析、学习。
文辞粗浅,不当之处请指教,如果觉得文章不错,请关注或点赞 (-__-)谢谢