责任链模式简单实现

两种实现方式

第一种

java 复制代码
public interface IBaseTask {
    public void doAction(String isTask,IBaseTask iBaseTask);
}
java 复制代码
public class ChainManager implements IBaseTask{
	//工作类的集合
    private List<IBaseTask> iBaseTaskList = new ArrayList<>();

    public void addTask(IBaseTask iBaseTask){
        iBaseTaskList.add(iBaseTask);
    }
	//下标
    private int index = 0;

    @Override
    public void doAction(String isTask, IBaseTask iBaseTask) {
        if(iBaseTaskList.isEmpty()){};
        if (index >= iBaseTaskList.size()){
            return;
        }
        //获取对应下标的任务对象
        IBaseTask baseTask = iBaseTaskList.get(index);

        index ++;
		//执行任务
        baseTask.doAction(isTask,iBaseTask);
    }
}

//创建三个责任链对象

java 复制代码
public class TaskOne implements IBaseTask{
    @Override
    public void doAction(String isTask, IBaseTask iBaseTask) {
        if ("1".equals(isTask)) {
            System.out.println("拦截器1处理了");
        }else{
            iBaseTask.doAction(isTask,iBaseTask);
        }
    }
}
java 复制代码
public class TaskTwo implements IBaseTask{
    @Override
    public void doAction(String isTask, IBaseTask iBaseTask) {
        if ("2".equals(isTask)) {
            System.out.println("拦截器2处理了");
        }else{
            iBaseTask.doAction(isTask,iBaseTask);
        }
    }
}
java 复制代码
public class TaskThree implements IBaseTask{
    @Override
    public void doAction(String isTask, IBaseTask iBaseTask) {
        if ("3".equals(isTask)) {
            System.out.println("拦截器3处理了");
        }else{
            iBaseTask.doAction(isTask,iBaseTask);
        }
    }
}

执行

java 复制代码
private void zerenlian1() {
        ChainManager chainManager = new ChainManager();
        chainManager.addTask(new TaskOne());
        chainManager.addTask(new TaskTwo());
        chainManager.addTask(new TaskThree());
        //从TaskOne开始执行不对的话就自动执行TaskTwo
        chainManager.doAction("2",chainManager);
        //返回结果 "拦截器2处理了"
    }

第二种

java 复制代码
public abstract class BaseTask {
    private boolean isTask;

    public BaseTask(boolean isTask) {
        this.isTask = isTask;
    }

    private BaseTask nextTask;
    public void addTask(BaseTask nextTask){
        this.nextTask = nextTask;
    }

    public abstract void doAction();

    public void action(){
        if(isTask){
            doAction();
        }else{
            if(nextTask != null){
                nextTask.action();
            }
        }
    }
}
java 复制代码
public class Task1 extends BaseTask{
    public Task1(boolean isTask) {
        super(isTask);
    }

    @Override
    public void doAction() {
        System.out.println("节点1已被执行");
    }
}
java 复制代码
    private void zerenlian() {
        Task1 task1 = new Task1(false);
        Task2 task2 = new Task2(false);
        Task3 task3 = new Task3(true);

        task1.addTask(task2);
        task2.addTask(task3);

        task1.action();
    }
相关推荐
IUGEI7 分钟前
synchronized的工作机制是怎样的?深入解析synchronized底层原理
java·开发语言·后端·c#
q***136112 分钟前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
z***I39412 分钟前
Java桌面应用案例
java·开发语言
r***123833 分钟前
SpringBoot最佳实践之 - 使用AOP记录操作日志
java·spring boot·后端
来来走走35 分钟前
Android开发(Kotlin) LiveData的基本了解
android·开发语言·kotlin
间彧36 分钟前
Java进程内存深度解析:从JVM组件内存到RSS的全面视角
java
间彧43 分钟前
对比GraalVM Native Image与传统JVM,在内存管理方面各自适合哪些具体业务场景?
java
daidaidaiyu1 小时前
Spring IOC 源码学习一 基本姿势
java·spring
LSL666_1 小时前
SpringBoot自动配置类
java·spring boot·后端·自动配置类
。puppy2 小时前
MySQL 远程登录实验:通过 IP 地址跨机器连接实战指南
android·adb