责任链模式简单实现

两种实现方式

第一种

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();
    }
相关推荐
timi先生19 分钟前
语料库全栈项目部署 (Vue + Java + CQPweb)
java·前端·vue.js
sunwenjian88638 分钟前
Java进阶--IO流
java·开发语言
方白羽1 小时前
Android NFC 功能集成-读卡器模式
android·app·客户端
进击的cc1 小时前
Android Kotlin:委托属性深度解析
android·kotlin
进击的cc1 小时前
Android Kotlin:Kotlin数据类与密封类
android·kotlin
客卿1231 小时前
滑动窗口--模板
java·算法
恋猫de小郭1 小时前
你的蓝牙设备可能正在泄漏你的隐私? Bluehood 如何追踪附近设备并做隐私分析
android·前端·ios
zjjsctcdl1 小时前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
Moe4882 小时前
WebSocket :从浏览器 API 到 Spring 握手、Handler 与前端客户端
java·后端·架构
顶点多余2 小时前
线程互斥+线程同步+生产消费模型
java·linux·开发语言·c++