Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
1.什么是責(zé)任鏈模式
當(dāng)一個(gè)請(qǐng)求可能需要多個(gè)對(duì)象中的某個(gè)進(jìn)行處理時(shí),將這些對(duì)象連成一條鏈,并沿者這條鏈傳遞該請(qǐng)求,知道有一個(gè)對(duì)象處理它為止。這樣的情況或需求時(shí),可以采用責(zé)任鏈模式。
2.如何實(shí)現(xiàn)
1)處理者接口(Handler),負(fù)責(zé)定義處理請(qǐng)求的抽象方法,并設(shè)置下一個(gè)處理著的方法。
2)具體處理者,實(shí)現(xiàn)Handler接口中定義的方法。實(shí)現(xiàn)處理用戶請(qǐng)求的邏輯,并設(shè)置下一個(gè)處理請(qǐng)求的對(duì)象。如果能夠處理用戶求情就處理,如果不能處理,交給下一個(gè)對(duì)象進(jìn)行處理。
3)封裝類。對(duì)以上的具體處理者進(jìn)行封裝,使它們形成一個(gè)處理鏈條。
3.代碼實(shí)現(xiàn)
以一個(gè)資金審批舉例
1)處理者接口
/** * 處理者接口 * 定義處理請(qǐng)求的方法 * 設(shè)置下一個(gè)處理者 */ public interface Handler { public void handleRequest(int money); public void setNextHandler(Handler handler); }
2)處理者1
/** * 具體處理者--經(jīng)理 */ public class Manager implements Handler { Handler handler; @Override public boolean handleRequest(int money) { boolean result = false; if(money<1000){ System.out.println("同意"); result = true; }else{ //超出處理范圍,交給下一個(gè)處理著 if(handler!=null){ result = handler.handleRequest(money); } } return result; } @Override public void setNextHandler(Handler handler) { this.handler = handler; } }
3)處理著2
/** * 具體處理者--總經(jīng)理 */ public class GeneralManager implements Handler { Handler handler; @Override public boolean handleRequest(int money) { boolean result = false; if(money<10000){ System.out.println("同意"); result = true; }else{ //超出處理范圍,交給下一個(gè)處理著 if(handler!=null){ result = handler.handleRequest(money); } } return result; } @Override public void setNextHandler(Handler handler) { this.handler = handler; } }
4)封裝類
/** * 封裝類 * 將所有的具體處理者封裝成一條處理鏈 */ public class Contxt { private Handler handler1,handler2; public Contxt(){ } public void createHandlerChain(){ handler1 = new Manager(); handler2 = new GeneralManager(); handler1.setNextHandler(handler2); } public void responseRequest(int request){ handler1.handleRequest(request); } }
5)測(cè)試類
public class TestMain { public static void main(String args []){ int meney = 500; Contxt context = new Contxt(); //創(chuàng)建處理鏈 context.createHandlerChain(); //相應(yīng)請(qǐng)求 boolean result = context.responseRequest(meney); System.out.println(result); } }
4.總結(jié)
責(zé)任鏈模式的優(yōu)點(diǎn)
1)責(zé)任鏈中的對(duì)象只和自己的后繼是低耦合關(guān)系,和其他對(duì)象毫無(wú)關(guān)聯(lián),是程序更加的靈活。
2)程序可以動(dòng)態(tài)的增加、刪除處理者的關(guān)系,或重新委派新的處理者
到此這篇關(guān)于Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式的文章就介紹到這了,更多相關(guān)Java責(zé)任鏈模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信企業(yè)號(hào)驗(yàn)證/發(fā)送/接收消息
這篇文章主要介紹了微信企業(yè)號(hào)驗(yàn)證/發(fā)送/接收消息的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10Java中LinkedList和ArrayList的效率分析
本文主要介紹了Java中LinkedList和ArrayList的效率分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02@RefreshScope在Quartz 觸發(fā)器類導(dǎo)致異常問題解決分析
這篇文章主要為大家介紹了@RefreshScope在Quartz 觸發(fā)器類導(dǎo)致異常問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02java拷貝指定目錄下所有內(nèi)容到minIO代碼實(shí)例
這篇文章主要介紹了java拷貝指定目錄下所有內(nèi)容到minIO代碼實(shí)例,創(chuàng)建桶 直接使用工具類先判斷,再創(chuàng)建即可,創(chuàng)建文件夾,需要注意以"/"結(jié)尾,實(shí)際也是在minIO上創(chuàng)建文件,只是作為目錄的表現(xiàn)形式展示,需要的朋友可以參考下2024-01-01詳解Java如何實(shí)現(xiàn)數(shù)值校驗(yàn)的算法
給定一個(gè)字符串如何判斷它是否為數(shù)值類型?本文將帶著大家學(xué)習(xí)一下如何利用Java實(shí)現(xiàn)這個(gè)判斷算法,感興趣的小伙伴可以學(xué)習(xí)一下2022-04-04實(shí)例詳解Spring Boot實(shí)戰(zhàn)之Redis緩存登錄驗(yàn)證碼
本章簡(jiǎn)單介紹redis的配置及使用方法,本文示例代碼在前面代碼的基礎(chǔ)上進(jìn)行修改添加,實(shí)現(xiàn)了使用redis進(jìn)行緩存驗(yàn)證碼,以及校驗(yàn)驗(yàn)證碼的過程。感興趣的的朋友一起看看吧2017-08-08feignclient?https?接口調(diào)用報(bào)證書錯(cuò)誤的解決方案
這篇文章主要介紹了feignclient?https?接口調(diào)用報(bào)證書錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03