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、總經理
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。
總結:
職責鏈中每個類只需要處理自己該處理的工作(不該處理的傳遞給下一個對象完成),明確各類的責任範圍,符合類的最小封裝原則。類與類之間可以以鬆耦合的形式加以組織。
還可以根據需要自由組合工作流程。如工作流程發生變化,可以通過重新分配對象鏈便可適應新的工作流程。