什么是链?
1、链是一系列节点的集合。
2.、链的各节点可灵活拆分再重组。
责任链模式(职责链)
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,
将这个对象连成一条链,并沿着这条链传递该请求,直到处理完成。
角色
抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
抽象处理者角色
一个抽象类
package mrzhang.design.chain;
import java.util.Map;
/**
* @author zhangnianlei
* @date 2020/8/30
*/
public abstract class Hander {
protected Hander successor = null;
public Hander getSuccessor() {
return successor;
}
public void setSuccessor(Hander successor) {
this.successor = successor;
}
public abstract Map<String, Object> handFeeRequest(Map<String, Object> param);
}
具体处理者
抽象类的实现类1
package mrzhang.design.chain;
import java.util.Map;
/**
* @author zhangnianlei
* @date 2020/8/31
*/
public class CheckHander extends Hander {
@Override
public Map<String, Object> handFeeRequest(Map<String, Object> param) {
System.out.println("检查必填字段合法性");
if (getSuccessor() != null) {
return getSuccessor().handFeeRequest(param);
}
return null;
}
}
实现类2
package mrzhang.design.chain;
import java.util.Map;
/**
* @author zhangnianlei
* @date 2020/8/31
*/
public class VerifyBusinessLogicHander extends Hander {
@Override
public Map<String, Object> handFeeRequest(Map<String, Object> param) {
System.out.println("检查业务逻辑");
if (getSuccessor() != null) {
return getSuccessor().handFeeRequest(param);
}
return null;
}
}
实现类3
package mrzhang.design.chain;
import java.util.Map;
/**
* @author zhangnianlei
* @date 2020/8/31
*/
public class ImportHander extends Hander {
@Override
public Map<String, Object> handFeeRequest(Map<String, Object> param) {
System.out.println("导入数据");
if (getSuccessor() != null) {
return getSuccessor().handFeeRequest(param);
}
return null;
}
}
客户端类
构建一个链,然后使用该链处理请求
package mrzhang.design.chain;
/**
* @author zhangnianlei
* @date 2020/8/31
*/
public class Client {
public static void main(String[] args) {
// 构建各个角色
Hander h1 = new ImportHander();
Hander h2 = new VerifyBusinessLogicHander();
Hander h3 = new CheckHander();
// 将各个角色连接起来形成一条责任链
h3.setSuccessor(h2);
h2.setSuccessor(h1);
// 使用该责任链处理一条数据
h3.handFeeRequest(null);
}
}
责任链的使用场景
非常复杂的处理逻辑。
例如:新用户注册需要5个检查步骤
- 字段的合法性效验:验证用户的电话号码是否合法,邮箱是否合法,用户名是否合法,密码是否符合规则。
- 验证手机是否存在
- …
- …
- …
如果将这5个步骤都放在一个方法中,代码维护将会很混乱
此时可以将这5个步骤每一个步骤都写在一个单独的Hander实现类中,将实现类串接成一个责任链。
责任链的好处
- 通过行为型模式,可以更加清晰地划分类与对象的职责(单一职责原则)。
- 当需要改动某一步骤的逻辑时,只需改动该节点的实现类。
- 当需要增加新的步骤时,只需新增一个Hander的实现类,然后在将该节点添加到调用链中(符合开闭原则,面向新增开放,面向修改关闭)。
- 当需要删除一个步骤时,只需在调用链中删除对应的节点即可。