行为型-责任链模式

143 阅读1分钟

1.什么是责任链模式

责任链是一种行为设计模式, 允许你将请求沿着处理者链进行发送, 直至其中一个处理者对其进行处理。

2.案例

/**
 * com.example.design.structural.chain.v2
 * Description:
 *
 * @author jack
 * @date 2021/7/5 11:37 上午
 */
public interface Handler {

    /**
     * 所有子类实现该处理方法
     *
     * @param name     名称
     * @param password 密码
     * @return true:接着执行 false:中断执行
     */
    boolean handler(String name, String password);
}
/**
 * com.example.design.structural.chain.v2
 * Description:
 *
 * @author jack
 * @date 2021/7/5 11:37 上午
 */
public abstract class AbstractHandlerChain implements Handler {

    private AbstractHandlerChain next;

    public AbstractHandlerChain linkWith(AbstractHandlerChain handlerChain) {
        this.next = handlerChain;
        return handlerChain;
    }

    protected boolean chain(String name, String password) {
        if (next == null) {
            return true;
        }
        return next.handler(name, password);
    }
}
/**
 * com.example.design.structural.chain.v2
 * Description:
 *
 * @author jack
 * @date 2021/7/5 11:43 上午
 */
@Slf4j
public class HandlerChainA extends AbstractHandlerChain {

    @Override
    public boolean handler(String name, String password) {
        log.info("校验用户合法性通过 name:{},password:{}", name, password);
        return chain(name, password);
    }
    
}
/**
 * com.example.design.structural.chain.v2
 * Description:
 *
 * @author jack
 * @date 2021/7/5 11:43 上午
 */
@Slf4j
public class HandlerChainB extends AbstractHandlerChain {

    @Override
    public boolean handler(String name, String password) {
        log.info("记录用户登录日志 name:{},password:{}", name, password);
        return chain(name, password);
    }
}
/**
 * com.example.design.structural.chain.v2
 * Description:
 *
 * @author jack
 * @date 2021/7/5 11:43 上午
 */
@Slf4j
public class HandlerChainC extends AbstractHandlerChain {

    @Override
    public boolean handler(String name, String password) {
        log.info("用户登录,增加活跃度 name:{},password:{}", name, password);
        return chain(name, password);
    }
}

3.测试


/**
 * com.example.design.structural.chain.v2
 * Description:
 *
 * @author jack
 * @date 2021/7/5 11:53 上午
 */
public class Client {
    public static void main(String[] args) {
        AbstractHandlerChain chain = new HandlerChainA();
        chain.linkWith(new HandlerChainB())
                .linkWith(new HandlerChainC());

        chain.handler("张三", "123456");
    }
}

image.png