您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么理解web設(shè)計模式中的適配器模式”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
適配器模式(Adapter Pattern) :將一個接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對象結(jié)構(gòu)型模式。
適配器模式包含如下角色:
Target:目標(biāo)抽象類
Adapter:適配器類
Adaptee:適配者類
Client:客戶類
<!--more-->
我們都知道springMVC就用到了適配器模式,那他是怎么適配呢,我們來看看它的源碼,首先我們要清楚springMVC的執(zhí)行原理,它的整個流程我這里就不像述了,說一下關(guān)鍵的部分:
DispatcherServlte
會根據(jù)配置文件信息注冊HandlerAdapter
,如果在配置文件中沒有配置,那么DispatcherServlte
會獲取HandlerAdapter
的默認(rèn)配置,如果是讀取默認(rèn)配置的話,DispatcherServlte
會讀取DispatcherServlte.properties
文件,該文件中配置了三種HandlerAdapter
:HttpRequestHandlerAdapter
,SimpleControllerHandlerAdapter
和AnnotationMethodHandlerAdapter
。DispatcherServlte
會將這三個HandlerAdapter
對象存儲到它的handlerAdapters
這個集合屬性中,這樣就完成了HandlerAdapter
的注冊。
DispatcherServlte
會根據(jù)handlerMapping
傳過來的controller
與已經(jīng)注冊好了的HandlerAdapter
一一匹配,看哪一種HandlerAdapter
是支持該controller類型的,如果找到了其中一種HandlerAdapter
是支持傳過來的controller
類型,那么該HandlerAdapter
會調(diào)用自己的handle方法,handle方法運用java的反射機(jī)制執(zhí)行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 { ...... ...... } } }
這里只放上比較關(guān)鍵的代碼,我們可以看到當(dāng)一個請求進(jìn)入doDispatch()
方法的時候,它先去getHandlerAdapter()
中拿到適配器,這就是第二步中根據(jù)handlerMapping
中的controller
找到對應(yīng)適配器。找到適配器后通過ha.handle(processedRequest, response, mappedHandler.getHandler())
執(zhí)行我們自己的controller
,mappedHandler.getHandler()
就是我們自己的controller
。
至于handler()
如何知道該去執(zhí)行controller中哪個方法,當(dāng)然是通過注解去轉(zhuǎn)換對應(yīng)方法的。因此,這里的適配器模式還不是特別的純粹,還結(jié)合了反射機(jī)制。DispatcherServlte
屬于客戶端,我們的Controller
屬于被適配的類,HandlerAdapter
屬于適配器。
現(xiàn)在我們假定需要寫一個線程池任務(wù)調(diào)度框架,我們知道JDK自帶的線程框架可以創(chuàng)建一個線程池,但是線程池只能傳入實現(xiàn)runnable
接口或者callable
接口的對象。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); cachedThreadPool.execute(new Runnable() { @Override public void run() { } })
那我們要咋樣可以讓客戶端使用的時候無須繼承runnable
來使用我們的這個框架呢。你可以像springMVC一樣使用適配器加注解。也可以提供一個實現(xiàn)Runnable
接口的抽象適配器類,讓客戶端進(jìn)行一定的配置來將普通的類適配到Runnable
。
關(guān)于適配器的使用方面還有很多,比如spring security
的WebSecurityConfigurerAdapter
和netty
中的ChannelInboundHandlerAdapter
對于適配器模式類名一般都以Adapter
結(jié)尾
“怎么理解web設(shè)計模式中的適配器模式”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。