Java 设计模式之责任链模式及异步责任链详解
作者:普通人zzz~ 发布时间:2021-08-08 19:14:23
标签:Java,责任链模式,异步责任链
一、定义
责任链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多个对象都有机会处理请求。将接受请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。
在很多源码都有涉及,如Mybatis * 、Filter…
责任链模式属于行为型模式。
二、普通责任链模式
抽象处理类:AbstractProcessor
/**
* 抽象处理类
*/
public abstract class AbstractProcessor {
// 责任链
private AbstractProcessor nextProcessor;
public void setNextProcessor(AbstractProcessor nextProcessor){
this.nextProcessor = nextProcessor;
}
/**
* 链路调用
* @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) {
/**
* 构建一个链路
* paramsProcessor -> checkProcessor -> finalProcessor
*/
AbstractProcessor paramsProcessor = new ParamsProcessor();
AbstractProcessor checkProcessor = new CheckProcessor();
AbstractProcessor finalProcessor = new FinalProcessor();
paramsProcessor.setNextProcessor(checkProcessor);
checkProcessor.setNextProcessor(finalProcessor);
paramsProcessor.execute("Java责任链模式");
}
}
执行结果
paramsProcessor>>>>>>>>>>Java责任链模式
checkProcessor>>>>>>>>>>Java责任链模式
finalProcessor>>>>>>>>>>Java责任链模式
三、异步责任链模式
异步责任链模式采用责任链模式、生产者消费者模式组合。
抽象处理类:AbstractAsynProcessor
/**
* 异步责任链:采用线程、生产者消费者模式实现
*/
public abstract class AbstractAsynProcessor extends Thread {
// 用于存放当前责任链需要处理的对象
protected BlockingQueue<Object> queue;
// 链路对象
private AbstractAsynProcessor nextProcessor;
/**
* 执行
*
* @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() {
// 执行
try {
while (true) {
// 生产者消费者
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() {
// 初始化队列
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 {
/**
* 构建一个链路
* 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("请输入:");
asynParamsProcessor.getQueue().put(input.next());
}
}
}
执行结果
请输入:Java异步责任链
asynParamsProcessor>>>>>>>>>>Java异步责任链
asynCheckProcessor>>>>>>>>>>Java异步责任链
asynFinalProcessor>>>>>>>>>>Java异步责任链
来源:https://blog.csdn.net/qq_33375499/article/details/121186261


猜你喜欢
- 本文实例为大家分享了C#实现单词本功能的具体代码,供大家参考,具体内容如下看到网上有类似的教程视频实现单词本,于是自己敲了一个实现单词本功能
- 直接上代码,代码中使用四种方法遍历Hashtable。using System;using System.Collections;names
- 本文以案例形式分析了Android中TelephonyManager类的用法。分享给大家供大家参考。具体如下:目录结构:main.xml布局
- 这篇文章主要介绍了Java JDBC导致的反序列化攻击原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 本文实例为大家分享了Java实现图片旋转,供大家参考,具体内容如下方法一:普通方法实现图片旋转/** * 图像旋转  
- 本文实例为大家分享了Java实现单向链表反转的具体代码,供大家参考,具体内容如下1、实现代码public class LinkedListT
- 使用Java语言编写一个模拟网上超市购物结算功能的程序,要求程序运行后有一个图形用户界面,可供用户输入购买的各种商品相关信息,最后给出用户的
- 有很多地方要用到DatePickerDialog。但有时项目用到的主题样式是很丑的样式,显示出来的真丑。而我们真正想要的样式是这样的。这个就
- 在spring上传文件中,一般都使用了MultipartFile来接收,但是有需要用到File的地方,这里只介绍两种转为File的方法,当然
- 有时安全不得不考虑,看看新闻泄漏风波事件就知道了我们在用Spring boot进行开发时,经常要配置很多外置参数ftp、数据库连接信息、支付
- 拼图小游戏,学习阶段。很多不足,改进了一下演示图片:J_Puzzle.javaimport java.awt.BorderLayout;im
- 本文实例讲述了C#实现控制Windows系统关机、重启和注销的方法。分享给大家供大家参考。具体分析如下:使用.NET和C#.NET,我们可以
- 本文实例为大家分享了Android实现录制按钮的具体代码,供大家参考,具体内容如下初始化布局文件中参数private void initPa
- 本文实例讲述了WinForm实现的图片拖拽与缩放功能。分享给大家供大家参考,具体如下:最近做项目的时候遇到上传施工平面布置图,查看,因为图片
- 本文实例为大家分享了Android Studio实现登录界面的具体代码,供大家参考,具体内容如下题目设计一个登录界面。要求:a) 包含用户名
- 一、日志1、配置日志级别日志记录器(Logger)的行为是分等级的。如下表所示:分为:OFF、FATAL、ERROR、WARN、INFO、D
- 一、我们可以使用Spring Initializr来创建SpringBoot项目。Spring Initializr从本质上来说就是一个We
- 错误内容:com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis
- 本文介绍了android APP登陆页面适配的实现,分享给大家,具体如下:先看效果图。登陆首页效果图原理为RootView增加监听事件,然后
- 本文实例汇总了Java文件操作。分享给大家供大家参考,具体如下:1.创建文件夹//import java.io.*; File myFold