15 责任链模式

责任链模式

简要描述:
case1:一个对象不知道要被谁处理,在一个方法里面做判断显得过于冗余,这个时候就可以使用责任链模式,直接将对象丢进责任链中,传递到对应的处理器中就会进行处理。
case2:可以对一个对象进行一系列加工处理,责任链上的每一个节点都可以看着是处理对象的一个步骤。
case3:还可以进行校验,上一个校验步骤根据校验结果判断是否传递到下一个校验步骤。
15 责任链模式_第1张图片

一个简单的demo

抽象的处理者,不做具体的处理,定义好处理的方法handler()和设置下一个节点的方法setNext(),定义一个调用流程模板doing(),避免子类有繁琐的代码。

/**
 * 流程是规定好的,执行当前之后再执行下一步,
 * 可以用模板方法定义好。
 */
abstract class AbstractChainHandler{
    private AbstractChainHandler chainHandler;
    /**
     * 链条上的节点的具体细节
     */
    protected abstract boolean handler();
    // 链条启动方法
    public final void doing(){
        boolean handler = handler();
        // 根据处理结果判断是否继续递归下去。
        if (!handler) return;
        chainHandler.doing();
    }

    /**
     * 设置下一个节点
     * @param chainHandler
     */
    public final void setNext(AbstractChainHandler chainHandler) {
        this.chainHandler = chainHandler;
    }
}

一些具体的实现类,进行各种校验

class NameHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("校验姓名");
        return true;
    }
}
class PasswdHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("密码校验");
        return true;
    }
}
class AgeHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("年龄校验");
        return false;
    }
}
class UnHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("不知道校验啥");
        return true;
    }
}

客户端,定义链条的顺序

public class HandlerPattern {
    public static void main(String[] args) {
        // 创建链条上的每一个节点
        AbstractChainHandler nameHandler = new NameHandler();
        AbstractChainHandler passwdHandler = new PasswdHandler();
        AbstractChainHandler ageHandler = new AgeHandler();
        AbstractChainHandler unHandler = new UnHandler();
        // 将链条串起来
        nameHandler.setNext(passwdHandler);
        passwdHandler.setNext(ageHandler);
        ageHandler.setNext(unHandler);
        // 开始执行
        nameHandler.doing();
    }
}

完整代码见
txgitee

你可能感兴趣的:(设计模式,责任链模式,java,开发语言)