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());
}
}
測(cè)試類: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());
}
}
測(cè)試類: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)文章
Springboot測(cè)試類沒有bean注入問(wèn)題解析
這篇文章主要介紹了Springboot測(cè)試類沒有bean注入問(wèn)題解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
java實(shí)現(xiàn)在性能測(cè)試中進(jìn)行業(yè)務(wù)驗(yàn)證實(shí)例
這篇文章主要為大家介紹了java實(shí)現(xiàn)在性能測(cè)試中進(jìn)行業(yè)務(wù)驗(yàn)證實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Java線程監(jiān)聽,意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Java線程監(jiān)聽,意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Java設(shè)計(jì)模式之靜態(tài)工廠模式詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之靜態(tài)工廠模式,簡(jiǎn)單說(shuō)明了靜態(tài)工廠模式的概念、原理、實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2017-09-09
關(guān)于JAVA中stream流的基礎(chǔ)處理(獲取對(duì)象字段和對(duì)象批量處理等)
這篇文章主要介紹了關(guān)于JAVA中stream流的基礎(chǔ)處理,包含獲取對(duì)象字段、按字段排序、按字段去重、對(duì)象批量處理、指定字段轉(zhuǎn)數(shù)組等內(nèi)容,需要的朋友可以參考下2023-03-03
Shiro:自定義Realm實(shí)現(xiàn)權(quán)限管理方式
這篇文章主要介紹了Shiro:自定義Realm實(shí)現(xiàn)權(quán)限管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

