什么是职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。借这个对象连成一条链,并沿着这条链传递该请求,直到有对象处理为止。
模式角色
- Handler抽象处理者(Manager)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- Concrete Handler具体处理者(DepartmentManager、)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
UML类图
职责链模式
代码实现
一个请求有多个对象可以处理,但每个对象的处理条件或者具备的权限不同。比如公司员工请假,直属领导一般3天以内假期可以批准,3天以上需要总监签字。责任链模式就可以很好的解决这样的问题。
public abstract class Manager {
// 后继连接
private Manager next;
public Manager getNext() {
return next;
}
public void setNext(Manager next) {
this.next = next;
}
//定义一个抽象的处理请求的方法
public abstract String handlerRequest(String employee, int leaveDays);
}
public class DepartmentManager extends Manager {
@Override
public String handlerRequest(String employee, int leaveDays) {
if (leaveDays <= 3) {
System.out.println(this.getClass().getSimpleName() + ",同意:" + employee + leaveDays + "天,假期");
} else {
// 部门经理处理不了,判断是否有下一个执行者存在
if (null != getNext()) {
getNext().handlerRequest(employee, leaveDays);
} else {
System.out.println("没有执行者可以处理" + employee + leaveDays + "天,假期申请");
}
}
return null;
}
}
public class Director extends Manager {
@Override
public String handlerRequest(String employee, int leaveDays) {
if (leaveDays < 7 ) {
System.out.println(this.getClass().getSimpleName() + ",同意:" + employee + leaveDays + "天,假期");
} else {
// 总监处理不了,判断是否有下一个执行者存在
if (null != getNext()) {
getNext().handlerRequest(employee, leaveDays);
} else {
System.out.println("没有执行者可以处理" + employee + leaveDays + "天,假期申请");
}
}
return null;
}
}
public class Client {
public static void main(String[] args) {
DepartmentManager departmentManager = new DepartmentManager();
Director director = new Director();
// 部门经理下一级是总监
departmentManager.setNext(director);
departmentManager.handlerRequest("员工张三", 5);
System.out.println("******************************************");
director.handlerRequest("员工张三", 10);
}
}
Director,同意:员工张三5天,假期
******************************************
没有执行者可以处理员工张三10天,假期申请
优点
- 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
- 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
- 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
- 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
- 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则
缺点 - 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
- 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
- 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。
职责链模式完整代码













网友评论