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

责任链模式的理解:

  生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的。

  小学生请假条审批流程。

代码如下:

/**
 * 类功能说明:  告警规则
 * @author 尘世间迷茫的小书童
 *
 */
public class AlarmRule {
    
    private String name;
    
    private String type;
    
    /**
     * 阈值
     */
    private String threshold;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getThreshold() {
        return threshold;
    }
    public void setThreshold(String threshold) {
        this.threshold = threshold;
    }
    
}
/**
 * 类功能说明: 告警规则责任链处理节点抽象类
 * @author 尘世间迷茫的小书童
 *
 */
public abstract class AbstractRuleHandler {
    
    // 上一个处理器
    private AbstractRuleHandler preHandler;
    
    // 下一个处理器
    private AbstractRuleHandler nextHandler;
    
    /**
     * 业务执行
     * 
     * @author 尘世间迷茫的小书童
     * @param rule
     */
    public void doHandle(AlarmRule rule){
        try {
            doHandleReal(rule);
        } catch(Exception e) {
            // 业务代码执行失败主动回滚
            rollBack(rule);
            return;
        }
        
        // 业务代码执行成功主动调用下一个处理器处理
        if(null != nextHandler)
        {
            nextHandler.doHandle(rule);
        }
    }
    
    
    /**
     * 事务回滚
     * 
     * @param rule
     */
    public void rollBack(AlarmRule rule)
    {
        rollBackReal(rule);
        // 本处理器业务回滚完成,主动调用前一个处理器业务回滚
        if(null != preHandler)
        {
            preHandler.rollBack(rule);
        }
    }
    
    
    /**
     * 每个处理器特有的业务处理方法
     * 
     * @param rule
     * @throws Exception
     */
    public abstract void doHandleReal(AlarmRule rule) throws Exception;
    
    /**
     * 每个处理器特有的业务回滚方法
     * 
     * @param rule
     */
    public abstract void rollBackReal(AlarmRule rule);
    
    /**
     * 设置上一个业务处理器
     * @param preHandler
     * @return
     */
    private AbstractRuleHandler setPreHandler(AbstractRuleHandler preHandler) 
    {
        this.preHandler = preHandler;
        return preHandler;
    }

    /**
     * 设置下一个业务处理器
     * @param nextHandler
     * @return
     */
    public AbstractRuleHandler setNextHandler(AbstractRuleHandler nextHandler) 
    {
        this.nextHandler = nextHandler;
        nextHandler.setPreHandler(this);
        return nextHandler;
    }
}
/**
 * 规则入库处理器
 * 类功能说明:   告警规则持久化
 * @author 尘世间迷茫的小书童
 *
 */
public class RulePesistHandler extends AbstractRuleHandler {

    @Override
    public void doHandleReal(AlarmRule rule) throws Exception {
        if(null == rule.getName() || "".equals(rule.getName())){
            throw new Exception("Rule name is empty.");
        }
        System.out.println("规则入库处理器: " + "Persist rule success. Rule name is " + rule.getName());
    }

    @Override
    public void rollBackReal(AlarmRule rule) {
        System.out.println("规则入库处理器: " + "Roll persist rule. Rule name is " + rule.getName());
    }

}
/**
 * 流任务生成处理器
 * 类功能说明:   告警流规则生成
 * @author 尘世间迷茫的小书童
 *
 */
public class StreamGenerateHandler extends AbstractRuleHandler {

    @Override
    public void doHandleReal(AlarmRule rule) throws Exception {
        System.out.println("流任务生成处理器: " + "Generate stream success.");
    }

    @Override
    public void rollBackReal(AlarmRule rule) {
        System.out.println("流任务生成处理器: " + "Roll Generate stream.");
    }

}
/**
 * 阈值解析处理器
 * 类功能说明:   阈值解析
 * @author 尘世间迷茫的小书童
 *
 */
public class ThresholdParseHandler extends AbstractRuleHandler {

    @Override
    public void doHandleReal(AlarmRule rule) throws Exception {
        if(null == rule.getThreshold() || "".equals(rule.getThreshold())){
            throw new Exception("Threshold is empty.");
        }
        System.out.println("阈值解析处理器: " + "Parse threshold success. Threshold is " + rule.getThreshold());
    }

    @Override
    public void rollBackReal(AlarmRule rule) {
        System.out.println("阈值解析处理器: " + "Roll parse threshold. Threshold is " + rule.getThreshold());
    }

}
/**
 * 规则创建责任链
 * 类功能说明:   告警规则创建
 * @author 尘世间迷茫的小书童
 *
 */
public class AlarmRuleCreator {
    
    private AbstractRuleHandler alarmRuleHandler;
    
    public AlarmRuleCreator(){
        alarmRuleHandler = new ThresholdParseHandler();
        alarmRuleHandler.setNextHandler(new StreamGenerateHandler())
                .setNextHandler(new RulePesistHandler());
    }
    
    public void create(AlarmRule rule){
        alarmRuleHandler.doHandle(rule);
    }
    
    public static void main(String[] args){
        AlarmRule rule = new AlarmRule();
        rule.setThreshold("cpuRate < 10");
        rule.setName("Cpu Alarm");
        
        AlarmRuleCreator ruleCreator = new AlarmRuleCreator();
        ruleCreator.create(rule);
        System.out.println();
        
        rule.setName("");
        ruleCreator.create(rule);
    }

    
}

  

  代码虽然写了很多但意思很简单,你生成一条规则,按照一定流程处理该规则,一个流程处理完下一个流程处理,直到所有流程走完;中间但凡有一条不符合,回滚该流程,再回滚上一个处理流程,回滚全部操作。责任链的应用相当于工作流。

 

推荐阅读: https://www.cnblogs.com/coshaho/p/6815490.html  http://c.biancheng.net/view/1383.html

posted @ 2019-07-14 05:02  尘世间迷茫的小书童  阅读(177)  评论(0编辑  收藏  举报