责任链模式(chain of responsibility)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
在GoF23种设计模式中,属于行为型模式( Behavioral Patterns)
。
责任链可以明确各个对象负责的界限,是的每个对象只用关心自己负责的逻辑。对外,责任链提供了统一的请求入口,请求者只需要提交请求而不用关心具体的处理逻辑。
另外,责任链可以很方便的调整组合和添加新的责任人,利于系统的拓展性从而满足业务的快速迭代。
- 优点
- 降低耦合
- 增强了职责对象变更的灵活性
- 缺点
- 责任链过长会降低系统响应性能
- 使用场景
- 对某一请求需要对个对象进行协作处理时
实例
角色说明
- Handler
- 定义一个责任链接口
- 实现指定下一个责任链条
- ConcreteHandler
- 具体的责任链条
- Client
- 定义并调用责任链
举例
以公司日常出差经费报销流程为例。事件报销级别越高,审批的人就越高。
角色说明
- Handler(Handler)
- 审批人接口
- GroupLeaderHandler(ConcreteHandler)
- 小组主管
- DepartmentLeaderHandler(ConcreteHandler)
- 部门主管
- BossHandler(ConcreteHandler)
- 公司老板
- Client
- OA平台
code
- Handler.java
public abstract class Handler {
protected int level;
protected String name;
private Handler nextHandler;
public Handler(int level, String name) {
this.level = level;
this.name = name;
}
public Handler setNextHandler(Handler handler) {
this.nextHandler = handler;
return nextHandler;
}
public final void handler(int event) {
boolean check = check(event);
if (check) {
System.out.println(name + ":审批通过.");
} else if (nextHandler != null) {
System.out.println(name + ":报请上级审批.");
nextHandler.handler(event);
} else {
System.out.println(name + ":拒绝通过.");
}
}
protected abstract boolean check(int event);
}
- GroupLeaderHandler.java
public class GroupLeaderHandler extends Handler {
public GroupLeaderHandler(int level, String name) {
super(level, name);
}
@Override
protected boolean check(int event) {
return level >= event;
}
}
- DepartmentLeaderHandler.java
public class DepartmentLeaderHandler extends Handler {
public DepartmentLeaderHandler(int level, String name) {
super(level, name);
}
@Override
protected boolean check(int event) {
return level >= event;
}
}
- BossHandler.java
public class BossHandler extends Handler {
public BossHandler(int level, String name) {
super(level, name);
}
@Override
protected boolean check(int event) {
return level >= event;
}
}
- Client.java
public class Client {
public static void main(String[] args) {
Handler groupLeaderHandler = new GroupLeaderHandler(1, "[小组主管]张三");
Handler departmentLeaderHandler = new DepartmentLeaderHandler(2, "[部门主管]李四");
Handler bossHandler = new BossHandler(3, "[公司老板]王五");
//经费报销工单链
groupLeaderHandler.setNextHandler(departmentLeaderHandler).setNextHandler(bossHandler);
System.out.println("报请出差经费200元工单:");
groupLeaderHandler.handler(2);
System.out.println("\n报请出差经费500万元工单:");
groupLeaderHandler.handler(5);
}
}
- output
报请出差经费200元工单:
[小组主管]张三:报请上级审批.
[部门主管]李四:审批通过.
报请出差经费500万元工单:
[小组主管]张三:报请上级审批.
[部门主管]李四:报请上级审批.
[公司老板]王五:拒绝通过.
实例
code:javax.servlet.Filter
spring支持过滤器的设置,用户自己的过滤器会在项目启动时通过扫描加载到ApplicationFilterConfig
中,然后通过ApplicationFilterChain
对自定义的Filter进行排序,调用等处理。
角色说明
- Filter(Handler)
- 过滤器接口
- WebFilter(ConcreteHandler)
- 自己实现的过滤器
- FilterChain(Client)
- 客户端接口
- 过滤链的使用者,管理者
- ApplicationFilterChain(Client)
- 具体实现
总结
责任链模式在日常的开发中应用的最为频繁。每个微服务的核心处理流程都可以采用该设计模式进行系统设计。
使用责任链模式可以将复杂的业务流程解耦,使得处理的每一步只用关心自己的逻辑,让系统高内聚低耦合。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: