深入了解Java設(shè)計模式之職責(zé)鏈模式_第1頁
深入了解Java設(shè)計模式之職責(zé)鏈模式_第2頁
深入了解Java設(shè)計模式之職責(zé)鏈模式_第3頁
深入了解Java設(shè)計模式之職責(zé)鏈模式_第4頁
深入了解Java設(shè)計模式之職責(zé)鏈模式_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論