简要描述:
case1:一个对象不知道要被谁处理,在一个方法里面做判断显得过于冗余,这个时候就可以使用责任链模式,直接将对象丢进责任链中,传递到对应的处理器中就会进行处理。
case2:可以对一个对象进行一系列加工处理,责任链上的每一个节点都可以看着是处理对象的一个步骤。
case3:还可以进行校验,上一个校验步骤根据校验结果判断是否传递到下一个校验步骤。
抽象的处理者,不做具体的处理,定义好处理的方法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