Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,
该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。
要实现职责链模式,需要满足该模式的基本条件:
1、对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。
2、消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
3、处于对象链中的对象的职责分配。不同的对象完成不同的职责。
4、任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。
下面看结构图
Handler :处理类的抽象父类。
concreteHandler :具体的处理类。
模拟请假流程代码
1、假条
package com.zewe.link;
/**
* 假条
* @author ZeWe
*
*/
public class LeaveInfo {
private String leave_user;
private String leave_reason;
private Integer leave_days;
public String getLeave_user() {
return leave_user;
}
public void setLeave_user(String leave_user) {
this.leave_user = leave_user;
}
public String getLeave_reason() {
return leave_reason;
}
public void setLeave_reason(String leave_reason) {
this.leave_reason = leave_reason;
}
public Integer getLeave_days() {
return leave_days;
}
public void setLeave_days(Integer leave_days) {
this.leave_days = leave_days;
}
}
2、Handler抽象类(审批人)
package com.zewe.link;
public abstract class Approval {
protected Approval nextApproval;
public Approval setNextApproval(Approval nextApproval) {
this.nextApproval = nextApproval;
return this.nextApproval ;
}
public abstract void approval(LeaveInfo info);
}
3、主任
package com.zewe.link;
public class Director extends Approval{
@Override
public void approval(LeaveInfo info) {
if(info.getLeave_days() <= 5) {
System.out.println("主任审批通过 : 请假人 "+info.getLeave_user()+"因"+info.getLeave_reason()+"请假"+info.getLeave_days()+"天。");
}else {
//给下一个处理
if(null != this.nextApproval) {
this.nextApproval.approval(info);
}
}
}
}
4、经理
package com.zewe.link;
public class Manager extends Approval{
@Override
public void approval(LeaveInfo info) {
if(info.getLeave_days() <= 10) {
System.out.println("经理审批通过 : 请假人 "+info.getLeave_user()+"因"+info.getLeave_reason()+"请假"+info.getLeave_days()+"天。");
}else {
//给下一个处理
if(null != this.nextApproval) {
this.nextApproval.approval(info);
}
}
}
}
5、总经理
扫描二维码关注公众号,回复:
8919795 查看本文章
package com.zewe.link;
public class GeneralManager extends Approval{
@Override
public void approval(LeaveInfo info) {
if(info.getLeave_days() <= 20) {
System.out.println("总经理审批通过 : 请假人 "+info.getLeave_user()+"因"+info.getLeave_reason()+"请假"+info.getLeave_days()+"天。");
}else {
//给下一个处理
if(null != this.nextApproval) {
this.nextApproval.approval(info);
}
}
}
}
6、CEO
package com.zewe.link;
public class CEO extends Approval{
@Override
public void approval(LeaveInfo info) {
if(info.getLeave_days() <= 30) {
System.out.println("CEO审批通过 : 请假人 "+info.getLeave_user()+"因"+info.getLeave_reason()+"请假"+info.getLeave_days()+"天。");
}else {
System.out.println("审批不通过,最终审批人 CEO。");
}
}
}
7、执行
public class MainTest {
public static void main(String[] args) {
LeaveInfo info = new LeaveInfo();
info.setLeave_user("小明");
info.setLeave_reason("出国旅游");
info.setLeave_days(35);
Director director = new Director();
director.setNextApproval(new Manager()).setNextApproval(new GeneralManager()).setNextApproval(new CEO());
director.approval(info);
}
}
// 结果
//审批不通过,最终审批人 CEO。
总结:
职责链中每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。类与类之间可以以松耦合的形式加以组织。
还可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。