1、基本介绍
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 何时使用:在处理消息的时候以过滤很多道。 如何解决:拦截的类都实现统一接口。 关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。 应用实例: 1、员工请假,小于等于2天组长审批。大于2天小于等于10天项目经理审批。大于10天直接辞退(狗头)。
2、具体实现
定义抽象处理者
public abstract class Handler {// 组长可审批天数public static int groupTeamApproveDays = 2;// 项目经理可审批天数public static int projectManagerApproveDays = 10;// 该审批人可审批的天数级别public int approveLevel;// 下一级别审批人private Handler nextHandler;public Handler getNextHandler() {return nextHandler;}public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}// 处理请假审批的方法public void handleRequest(int requestDays) {// 实际请假天数,超出了该层级权限范围,提交下一级审批if (requestDays > this.approveLevel) {if (nextHandler != null) {nextHandler.handleRequest(requestDays);}if (nextHandler == null) {System.out.println("你还是走吧");}} else {approveComment();}}// 审批意见public abstract void approveComment();}
定义具体处理者
public class GroupTeam extends Handler {public GroupTeam(int approveLevel) {this.approveLevel = approveLevel;}@Overridepublic void approveComment() {System.out.println("本组长同意请假");}}public class ProjectManager extends Handler {public ProjectManager(int approveLevel) {this.approveLevel = approveLevel;}@Overridepublic void approveComment() {System.out.println("本项目经理同意请假");}}
运行
public class Demo {public static void main(String[] args) {// 组装责任链Handler groupTeam = new GroupTeam(Handler.groupTeamApproveDays);Handler projectManager = new ProjectManager(Handler.projectManagerApproveDays);groupTeam.setNextHandler(projectManager);// 请假groupTeam.handleRequest(1);groupTeam.handleRequest(8);groupTeam.handleRequest(12);}}

