责任链模式简单实现

两种实现方式

第一种

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();
    }
相关推荐
雨白3 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk3 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING4 小时前
RN容器启动优化实践
android·react native
后端AI实验室4 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风6 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme6 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
恋猫de小郭6 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Be_Better6 小时前
学会与虚拟机对话---ASM
java
开源之眼8 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori3169 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java