目录
1.什么是Adapter模式
中文名字叫做设配器模式。联系实际的话就像我们转接头一样,比如现在的手机取消了耳机孔,但是我们这些普通老百姓不可能花几百块再买一个充电孔的耳机吧?所以我们理所当然的可以买一个充电口转耳机孔的转接头或者叫做设配器。这样子我们就可以不用花较大的代价去听音乐了。而在程序的世界也一样,我们实际上已经有了某个功能实现类,但是现在这个功能实现类不能满足现在的需求,我们可以通过设配器进行转换设配成我们实际需要的功能实现类。Adapter模式也叫做Wrapper模式。Wrapper的中文意思是包装器。
Adper模式有两种
- 类设配器模式(继承)
通过继承Adaptee和实现实际需求接口Target来实现Adapter,最后交给调用者Client使用
- 对象设配器模式(委托)
委托是指将某个方法的实际处理交给其他实例使用,在这里我们通过继承实际需求类Target和声明成员变量Adaptee来实现Adapter,最后交给调用者client使用
2.什么时候用Adapter模式
- 拥有现成代码
因为很多时候的开发都是中途开始的,一些写好的方法已经经过了充分的测试,所以如果我们在继续编写到类似而又不全是的功能的时候,一般会将这些测试过的类重用,但是为了应对差异性,所以会用设配器模式。并且使用此模式,在进行bug排查的时候就可以比较快速的找到问题所在。
- 版本升级与兼容性
可以使用Adapter模式使新版本扮演Adaptee角色,旧版本扮演Target角色。
3.Adapter模式中的角色
- Target(实际需求接口)
在程序中,一般来说是我们实际需要的方法的接口
我们通过springmvc的请求转发的设配器来了解下
public interface HandlerAdapter {
boolean supports(Object var1);
@Nullable
ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
long getLastModified(HttpServletRequest var1, Object var2);
}
- Client(请求者)就是调用者了,用来调用适配角色的
下面是请求转发的核心方法,可以看到DispatcherServlet()通过处理器映射器找到处理器,之后通过处理器获取处理器的适配器
public class DispatcherServlet extends FrameworkServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
...省略
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
mappedHandler = this.getHandler(processedRequest);
if (mappedHandler == null) {
this.noHandlerFound(processedRequest, response);
return;
}
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
this.applyDefaultViewName(processedRequest, mv);
...省略
}
public boolean supports(Object handler) {
return handler instanceof Controller;
}
- Adaptee(被设配角色)
一般来说就是拥有功能的某一个类但是不符合实际需求调用
可以说handle都是被适配角色,例如@Controller的类都会被通过动态代理的方式变成被适配角色
- Adapter(设配角色)
拥有功能的某一个类通过实现实际需求接口来符合实际需求调用
就是我们自己写的一些Controller类咯
4.总结
把各种不同类型的类设配成一个统一的接口实现类或者某个类的子类(Target),方便调用,达成设计模式的开闭原则,对扩展开放,对修改关闭
参考书籍 :《图解设计模式》
作者:【日】结城浩
翻译:杨文轩