




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第深入了解Java設(shè)計模式之職責(zé)鏈模式目錄定義解決的問題核心要點類圖代碼實現(xiàn)抽象父類執(zhí)行者-三個客戶端拓展應(yīng)用場景
定義
使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接受者之間的耦合關(guān)系,將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
解決的問題
請求和處理分開、實現(xiàn)解耦、提高系統(tǒng)的靈活性
可以動態(tài)的調(diào)整請求的鏈條,增加系統(tǒng)靈活性
核心要點
職責(zé)鏈模式每個執(zhí)行者都包含了另一個執(zhí)行者的引用。如果一個對象不能處理該請求,會把請求傳遞給下一個執(zhí)行者。
客戶端需要動態(tài)的調(diào)整,執(zhí)行者的上下級。
Handler里面聚合它自己,在HandlerRequest里判斷是否合適,如果沒達(dá)到條件則向下傳遞,向誰傳遞之前set進(jìn)去。
類圖
代碼實現(xiàn)
抽象父類
/**
*處理請求的抽象類
*@authorPromsing(張有博)
*@version1.0.0
*@since2025/9/7-9:29
publicabstractclassHandler{
//維持一個下一個執(zhí)行者的引用
protectedHandlerhandler;
protectedvoidsetHandler(Handlerhandler){
this.handler=handler;
//處理請求的抽象方法
publicabstractvoidprocessRequest(intrequest);
執(zhí)行者-三個
/**
*只處理數(shù)字1-10
*@authorPromsing(張有博)
*@version1.0.0
*@since2025/9/7-9:31
publicclassConcreteHandlerAextendsHandler{
@Override
publicvoidprocessRequest(intrequest){
if(request=0request10){
System.out.println("ConcreteHandlerA已經(jīng)處理完畢了"+request);
return;
if(handler!=null){
//下一位處理
cessRequest(request);
*只處理數(shù)字10-20
*@authorPromsing(張有博)
*@version1.0.0
*@since2025/9/7-9:31
publicclassConcreteHandlerBextendsHandler{
@Override
publicvoidprocessRequest(intrequest){
if(request=10request20){
System.out.println("ConcreteHandlerB已經(jīng)處理完畢了"+request);
return;
if(handler!=null){
//下一位處理
cessRequest(request);
*只處理數(shù)字30+
*@authorPromsing(張有博)
*@version1.0.0
*@since2025/9/7-9:31
publicclassConcreteHandlerCextendsHandler{
@Override
publicvoidprocessRequest(intrequest){
if(request=30){
System.out.println("ConcreteHandlerC已經(jīng)處理完畢了"+request);
return;
if(handler!=null){
//下一位處理
cessRequest(request);
客戶端
publicclassMain{
publicstaticvoidmain(String[]args){
//創(chuàng)建執(zhí)行者
Handlerh1=newConcreteHandlerA();
Handlerh2=newConcreteHandlerB();
Handlerh3=newConcreteHandlerC();
//設(shè)置向下級的順序,可根據(jù)配置動態(tài)設(shè)置上下級
h1.setHandler(h2);
h2.setHandler(h3);
int[]requests={8,11,23,50,7,19,28,40};
//循環(huán)處理請求,不同的數(shù)值,交給不同的執(zhí)行者
for(intrequest:requests){
cessRequest(request);
拓展
SpringMVC中DispatchServlet使用職責(zé)鏈
protectedvoiddoDispatch(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
HttpServletRequestprocessedRequest=request;//請求
HandlerExecutionChainmappedHandler=null;//執(zhí)行鏈
try{
ModelAndViewmv=null;
ExceptiondispatchException=null;
try{
//Determinehandlerforthecurrentrequest.
mappedHandler=getHandler(processedRequest);//根據(jù)請求-獲得執(zhí)行鏈
//判斷mappedHandler是否為空,空:404
if(mappedHandler==null){
noHandlerFound(processedRequest,response);
return;
//確定當(dāng)前請求的處理程序適配器
HandlerAdapterha=getHandlerAdapter(mappedHandler.getHandler());
//職責(zé)鏈的前置攔截
if(!mappedHandler.applyPreHandle(processedRequest,response)){
return;
//執(zhí)行handler方法-controller
mv=ha.handle(processedRequest,response,mappedHandler.getHandler());
//職責(zé)鏈的后置攔截
mappedHandler.applyPostHandle(processedRequest,response,mv);
catch(Exceptionex){
dispatchException=ex;
//對結(jié)果集進(jìn)行處理
processDispatchResult(processedRequest,response,mappedHandler,mv,dispatchException);
catch(Exceptionex){
//執(zhí)行完成了攔截器
triggerAfterCompletion(processedRequest,response,mappedHandler,ex);
finally{
//資源釋放
攔截器的方法
booleanapplyPreHandle(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
HandlerInterceptor[]interceptors=getInterceptors();//獲得攔截器
if(!ObjectUtils.isEmpty(interceptors)){
for(inti=0;iinterceptors.length;i++){//循環(huán)遍歷執(zhí)行前置攔截
HandlerInterceptorinterce
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年護(hù)理政策研究試題及答案
- 北京2025年北京第四實驗學(xué)校招聘45人筆試歷年參考題庫附帶答案詳解
- 中國文化產(chǎn)業(yè)發(fā)展的新機遇及試題及答案
- 2025年護(hù)士執(zhí)業(yè)考試的核心試題及答案
- 佛山佛山市圖書館公開招聘高層次人才筆試歷年參考題庫附帶答案詳解
- 2025年江蘇省宿遷市泗洪縣部分事業(yè)單位公開招聘筆試歷年典型考題及考點剖析附帶答案詳解
- 2025年亳州市市直事業(yè)單位公開招聘工作人員筆試(加分后)筆試歷年典型考題及考點剖析附帶答案詳解
- 股份合作回購協(xié)議書
- 美國制定月球協(xié)議書
- 花木買賣合同協(xié)議書
- 鐵路建設(shè)項目安全管理
- 項目管理課件
- 裝配式建筑施工技術(shù)PPT(高職)完整全套教學(xué)課件
- 涉詐風(fēng)險賬戶審查表
- 關(guān)風(fēng)器設(shè)計說明書
- 2023年副主任醫(yī)師(副高)-兒童保健(副高)考試歷年真題精華集選附答案
- 《莊子過惠子之墓》中考文言文閱讀試題2篇(含答案與翻譯)
- HT9988詳細(xì)使用說明書
- 橋式起重機司機(初級)職業(yè)技能鑒定考試題庫(職校培訓(xùn))
- 【超星爾雅學(xué)習(xí)通】世界建筑史網(wǎng)課章節(jié)答案
- 認(rèn)識水拓畫完整版
評論
0/150
提交評論