Java 設(shè)計(jì)模式之責(zé)任鏈模式及異步責(zé)任鏈詳解
一、定義
責(zé)任鏈模式(Chain of Responsibility Pattern):避免將一個(gè)請(qǐng)求的發(fā)送者與接受者耦合在一起,讓多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求。將接受請(qǐng)求的對(duì)象連接成一條鏈,并且沿著這條鏈傳遞請(qǐng)求,直到有一個(gè)對(duì)象能夠處理它為止。
在很多源碼都有涉及,如Mybatis攔截器、Filter…
責(zé)任鏈模式屬于行為型模式。
二、普通責(zé)任鏈模式
抽象處理類:AbstractProcessor
/** * 抽象處理類 */ public abstract class AbstractProcessor { // 責(zé)任鏈 private AbstractProcessor nextProcessor; public void setNextProcessor(AbstractProcessor nextProcessor){ this.nextProcessor = nextProcessor; } /** * 鏈路調(diào)用 * @param obj */ public void execute(Object obj) { this.processor(obj); if (this.nextProcessor != null){ this.nextProcessor.execute(obj); } } public abstract void processor(Object obj); }
具體類:ParamsProcessor、CheckProcessor、FinalProcessor
public class ParamsProcessor extends AbstractProcessor{ @Override public void processor(Object obj) { System.out.println("paramsProcessor>>>>>>>>>>" + obj.toString()); } } public class CheckProcessor extends AbstractProcessor{ @Override public void processor(Object obj) { System.out.println("checkProcessor>>>>>>>>>>" + obj.toString()); } } public class FinalProcessor extends AbstractProcessor{ @Override public void processor(Object obj) { System.out.println("finalProcessor>>>>>>>>>>" + obj.toString()); } }
測試類:ProcessorMainTest
public class ProcessorMainTest { public static void main(String[] args) { /** * 構(gòu)建一個(gè)鏈路 * paramsProcessor -> checkProcessor -> finalProcessor */ AbstractProcessor paramsProcessor = new ParamsProcessor(); AbstractProcessor checkProcessor = new CheckProcessor(); AbstractProcessor finalProcessor = new FinalProcessor(); paramsProcessor.setNextProcessor(checkProcessor); checkProcessor.setNextProcessor(finalProcessor); paramsProcessor.execute("Java責(zé)任鏈模式"); } }
執(zhí)行結(jié)果
paramsProcessor>>>>>>>>>>Java責(zé)任鏈模式
checkProcessor>>>>>>>>>>Java責(zé)任鏈模式
finalProcessor>>>>>>>>>>Java責(zé)任鏈模式
三、異步責(zé)任鏈模式
異步責(zé)任鏈模式采用責(zé)任鏈模式、生產(chǎn)者消費(fèi)者模式組合。
抽象處理類:AbstractAsynProcessor
/** * 異步責(zé)任鏈:采用線程、生產(chǎn)者消費(fèi)者模式實(shí)現(xiàn) */ public abstract class AbstractAsynProcessor extends Thread { // 用于存放當(dāng)前責(zé)任鏈需要處理的對(duì)象 protected BlockingQueue<Object> queue; // 鏈路對(duì)象 private AbstractAsynProcessor nextProcessor; /** * 執(zhí)行 * * @param obj */ public void execute(Object obj) throws InterruptedException { this.processor(obj); if (this.nextProcessor != null) { this.nextProcessor.getQueue().put(obj); } } @Override public void run() { // 執(zhí)行 try { while (true) { // 生產(chǎn)者消費(fèi)者 Object obj = this.queue.take(); execute(obj); } } catch (InterruptedException e) { e.printStackTrace(); } } public abstract void processor(Object obj); public BlockingQueue<Object> getQueue() { return queue; } public void setNextProcessor(AbstractAsynProcessor nextProcessor) { this.nextProcessor = nextProcessor; } }
具體類:AsynParamsProcessor、AsynCheckProcessor、AsynFinalProcessor
public class AsynParamsProcessor extends AbstractAsynProcessor { public AsynParamsProcessor() { // 初始化隊(duì)列 this.queue = new LinkedBlockingQueue<>(); } @Override public void processor(Object obj) { System.out.println("asynParamsProcessor>>>>>>>>>>" + obj.toString()); } } public class AsynCheckProcessor extends AbstractAsynProcessor { public AsynCheckProcessor(){ this.queue = new LinkedBlockingQueue<>(); } @Override public void processor(Object obj) { System.out.println("asynCheckProcessor>>>>>>>>>>" + obj.toString()); } } public class AsynFinalProcessor extends AbstractAsynProcessor { public AsynFinalProcessor() { this.queue = new LinkedBlockingQueue<>(); } @Override public void processor(Object obj) { System.out.println("asynFinalProcessor>>>>>>>>>>" + obj.toString()); } }
測試類:AsynProcessorMainTest
public class AsynProcessorMainTest { public static void main(String[] args) throws InterruptedException { /** * 構(gòu)建一個(gè)鏈路 * asynParamsProcessor -> asynCheckProcessor -> asynFinalProcessor */ AbstractAsynProcessor asynParamsProcessor = new AsynParamsProcessor(); asynParamsProcessor.start(); AbstractAsynProcessor asynCheckProcessor = new AsynCheckProcessor(); asynCheckProcessor.start(); AbstractAsynProcessor asynFinalProcessor = new AsynFinalProcessor(); asynFinalProcessor.start(); asynParamsProcessor.setNextProcessor(asynCheckProcessor); asynCheckProcessor.setNextProcessor(asynFinalProcessor); Scanner input = new Scanner(System.in); while (true) { Thread.sleep(1000); System.out.print("請(qǐng)輸入:"); asynParamsProcessor.getQueue().put(input.next()); } } }
執(zhí)行結(jié)果
請(qǐng)輸入:Java異步責(zé)任鏈
asynParamsProcessor>>>>>>>>>>Java異步責(zé)任鏈
asynCheckProcessor>>>>>>>>>>Java異步責(zé)任鏈
asynFinalProcessor>>>>>>>>>>Java異步責(zé)任鏈
到此這篇關(guān)于Java 設(shè)計(jì)模式之責(zé)任鏈模式及異步責(zé)任鏈詳解的文章就介紹到這了,更多相關(guān)Java 設(shè)計(jì)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java設(shè)計(jì)模式之責(zé)任鏈模式的示例詳解
- Java設(shè)計(jì)模式之責(zé)任鏈模式
- Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
- Java設(shè)計(jì)模式之責(zé)任鏈模式詳解
- Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式詳解
- java設(shè)計(jì)模式(實(shí)戰(zhàn))-責(zé)任鏈模式
- Java設(shè)計(jì)模式之java責(zé)任鏈模式詳解
- 詳解Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
- Java設(shè)計(jì)模式中責(zé)任鏈模式詳解
相關(guān)文章
分析Spring框架之設(shè)計(jì)與實(shí)現(xiàn)資源加載器
Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。今天來分析它的設(shè)計(jì)與實(shí)現(xiàn)資源加載器,從Spring.xml解析和注冊(cè)Bean對(duì)象2021-06-06使用MyBatis 動(dòng)態(tài)update數(shù)據(jù)
使用mybatis寫sql,需要?jiǎng)討B(tài)更新對(duì)象數(shù)據(jù),每次需要更新的字段不同,為了防止null空異常,就需要用動(dòng)態(tài)sql了,下面給大家分享一段代碼關(guān)于mybatis動(dòng)態(tài)update,需要的朋友參考下2016-11-11idea導(dǎo)入配置Spring?Boot項(xiàng)目的詳細(xì)步驟教程
這篇文章主要給大家介紹了關(guān)于idea導(dǎo)入配置Spring?Boot項(xiàng)目的詳細(xì)步驟,在項(xiàng)目開發(fā)過程中,無論是導(dǎo)入運(yùn)行團(tuán)隊(duì)開發(fā)的項(xiàng)目,還是一些開源項(xiàng)目,還是其他的項(xiàng)目,想要在IDEA中完整的運(yùn)行起來總有很多坑,需要的朋友可以參考下2023-08-08java模板引擎Thymeleaf和前端vue的區(qū)別及說明
這篇文章主要介紹了java模板引擎Thymeleaf和前端vue的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11SpringBoot攔截器實(shí)現(xiàn)項(xiàng)目防止接口重復(fù)提交
基于SpringBoot框架來開發(fā)業(yè)務(wù)后臺(tái)項(xiàng)目時(shí),接口重復(fù)提交是一個(gè)常見的問題,本文主要介紹了SpringBoot攔截器實(shí)現(xiàn)項(xiàng)目防止接口重復(fù)提交,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Spring Cloud Hystrix 服務(wù)容錯(cuò)保護(hù)的原理實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Hystrix 服務(wù)容錯(cuò)保護(hù)的原理實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05Java 并發(fā)編程ArrayBlockingQueue的實(shí)現(xiàn)
這篇文章主要介紹了Java 并發(fā)編程ArrayBlockingQueue的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02