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");
}
}