设计模式--责任链模式

Posted 我爱看明朝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--责任链模式相关的知识,希望对你有一定的参考价值。

设计模式–责任链模式

当我们需要连续链式的进行处理数据时:你可以理解为接力赛,接力棒就是我们处理的数据,队员就是就是不同的处理器(mybaitis就是自定义插件)

责任链中的角色

责任链模式中有两个角色: 处理者、调度者

调度者:负责责任在处理这之间的传播
处理者:只负责处理自己的逻辑,保持单一原则

要点: 各个处理器要符合单一原则,关注自己的逻辑就行,任务的传播交给调度这就Ok了

应用

mybaits的插件机制
servlet中filter机制

工作流、管道流、各种类型的审批

责任链实现

/**
 * 任务抽象方法
 * @author
 * @description
 **/
public abstract class Task {

    public abstract Object hanlderTask(Object o);
}

/**
 * 调度者
 * @author xuelongjiang109
 * @description
 **/
public class Chain {

    private List<Task> taskList = new ArrayList<Task>();

    public void handler() {
        Object object = new Object();

        for (Task task : taskList) {
            object = task.hanlderTask(object);
        }
    }

    // 加入
    public void addTask(Task task) {
        taskList.add(task);
    }

}
// 具体任务
public class TaskOne extends  Task {

    @Override
    public Object hanlderTask(Object o) {
        // 处理逻辑返回object
        System.out.println("处理任务1");
        return o;
    }
}

public class TaskTwo extends  Task {

    public Object hanlderTask(Object o) {
        System.out.println("处理任务2");
        return o;
    }
}

//具体任务
public class Client {

    public static void main(String[] args) {

        Chain chain = new Chain();
        chain.addTask(new TaskOne());
        chain.addTask(new TaskTwo());
        chain.handler();

    }

}

实践:部署审批

我们写一个示例,需求如下:部署不同环境需要不同角色审批
ci: 只需要开发者通过就可以部署
stg:需要开发者、测试人员通过就可以部署
prd:需要开发者、测试人员、团队leader同意才可以部署

// 调度者
public class DeployChain {

    private List<AbstractDeployHandler> handlers = new ArrayList<AbstractDeployHandler>();

    public void handler(DeployInfo deployInfo) {
        System.out.println("当前需部署环境:" + deployInfo.getEnv());
        for (AbstractDeployHandler deployHandler : handlers) {
            deployHandler.handlerDeploy(deployInfo);
            if (!deployInfo.isResult()) {
                break;
            }
        }
    }

    public void addHandler(AbstractDeployHandler handler) {
        handlers.add(handler);
    }

}
// 部署信息
public class DeployInfo {

    private String env;
    //是否同意部署
    private boolean result = false;

    public String getEnv() {
        return env;
    }

    public void setEnv(String env) {
        this.env = env;
    }

    public boolean isResult() {
        return result;
    }

    public void setResult(boolean result) {
        this.result = result;
    }
}
// 抽象的处理者
public abstract class AbstractDeployHandler {

    public abstract DeployInfo handlerDeploy(DeployInfo deployInfo);

}

//角色为开发者的处理者
public class DevRoleDeployHanlder extends  AbstractDeployHandler {

    public DeployInfo handlerDeploy(DeployInfo deployInfo) {
        if ("ci".equals(deployInfo.getEnv())
        || "stg".equals(deployInfo.getEnv())
                || "prd".equals(deployInfo.getEnv())) {
            deployInfo.setResult(true);
            System.out.println("我是开发者,允许部署");
        }
        return deployInfo;
    }
}

//角色为测试者的处理者
public class TestRoleDeployHanlder extends  AbstractDeployHandler{

    public DeployInfo handlerDeploy(DeployInfo deployInfo) {
        if ("stg".equals(deployInfo.getEnv())
                || "prd".equals(deployInfo.getEnv())) {
            deployInfo.setResult(true);
            System.out.println("我是测试人员,允许部署");
        } else {
            deployInfo.setResult(false);
        }
        return deployInfo;
    }
}

//角色为团队leader的处理者
public class LeaderDeployHanlder extends  AbstractDeployHandler {

    public DeployInfo handlerDeploy(DeployInfo deployInfo) {
        if ("prd".equals(deployInfo.getEnv())) {
            deployInfo.setResult(true);
            System.out.println("我是项目leader,允许部署");
        } else {
            deployInfo.setResult(false);
        }
        return deployInfo;
    }
}




public class Client {

    public static void main(String[] args) {

        DeployInfo info = new DeployInfo();
        info.setEnv("ci");

        AbstractDeployHandler dever = new DevRoleDeployHanlder();
        AbstractDeployHandler tester = new TestRoleDeployHanlder();
        AbstractDeployHandler leader = new LeaderDeployHanlder();

        DeployChain chain = new DeployChain();
        chain.addHandler(dever);
        chain.addHandler(tester);
        chain.addHandler(leader);

        chain.handler(info);
    }

}

以上是关于设计模式--责任链模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式----责任链模式

设计模式之责任链模式

责任链模式

前端探索告别烂代码 用责任链模式封装网络请求

(十五)责任链模式-代码实现

设计模式:责任链模式