本篇内容介绍了“怎么理解web设计模式中的适配器模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
适配器模式包含如下角色:
Target:目标抽象类
Adapter:适配器类
Adaptee:适配者类
Client:客户类
<!--more-->
我们都知道springMVC就用到了适配器模式,那他是怎么适配呢,我们来看看它的源码,首先我们要清楚springMVC的执行原理,它的整个流程我这里就不像述了,说一下关键的部分:
DispatcherServlte
会根据配置文件信息注册HandlerAdapter
,如果在配置文件中没有配置,那么DispatcherServlte
会获取HandlerAdapter
的默认配置,如果是读取默认配置的话,DispatcherServlte
会读取DispatcherServlte.properties
文件,该文件中配置了三种HandlerAdapter
:HttpRequestHandlerAdapter
,SimpleControllerHandlerAdapter
和AnnotationMethodHandlerAdapter
。DispatcherServlte
会将这三个HandlerAdapter
对象存储到它的handlerAdapters
这个集合属性中,这样就完成了HandlerAdapter
的注册。
DispatcherServlte
会根据handlerMapping
传过来的controller
与已经注册好了的HandlerAdapter
一一匹配,看哪一种HandlerAdapter
是支持该controller类型的,如果找到了其中一种HandlerAdapter
是支持传过来的controller
类型,那么该HandlerAdapter
会调用自己的handle方法,handle方法运用java的反射机制执行controller的具体方法来获得ModelAndView
DispatcherServlte
部分源码
public class DispatcherServlet extends FrameworkServlet {
......
......
@Nullable
private List<HandlerMapping> handlerMappings;
@Nullable
private List<HandlerAdapter> handlerAdapters;
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
ModelAndView mv = null;
Object dispatchException = null;
try {
......
......
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
......
......
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
this.applyDefaultViewName(processedRequest, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
} catch (Exception var20) {
dispatchException = var20;
} catch (Throwable var21) {
......
}
......
} catch (Exception var22) {
......
} catch (Throwable var23) {
......
}
} finally {
......
......
}
}
}
这里只放上比较关键的代码,我们可以看到当一个请求进入doDispatch()
方法的时候,它先去getHandlerAdapter()
中拿到适配器,这就是第二步中根据handlerMapping
中的controller
找到对应适配器。找到适配器后通过ha.handle(processedRequest, response, mappedHandler.getHandler())
执行我们自己的controller
,mappedHandler.getHandler()
就是我们自己的controller
。
至于handler()
如何知道该去执行controller中哪个方法,当然是通过注解去转换对应方法的。因此,这里的适配器模式还不是特别的纯粹,还结合了反射机制。DispatcherServlte
属于客户端,我们的Controller
属于被适配的类,HandlerAdapter
属于适配器。
现在我们假定需要写一个线程池任务调度框架,我们知道JDK自带的线程框架可以创建一个线程池,但是线程池只能传入实现runnable
接口或者callable
接口的对象。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
}
})
那我们要咋样可以让客户端使用的时候无须继承runnable
来使用我们的这个框架呢。你可以像springMVC一样使用适配器加注解。也可以提供一个实现Runnable
接口的抽象适配器类,让客户端进行一定的配置来将普通的类适配到Runnable
。
关于适配器的使用方面还有很多,比如spring security
的WebSecurityConfigurerAdapter
和netty
中的ChannelInboundHandlerAdapter
对于适配器模式类名一般都以Adapter
结尾
“怎么理解web设计模式中的适配器模式”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4105374/blog/3120111