責任鏈
需求
想像一下你是公務員,有很多承包商的報價需求,需要長官審核,長官有下列幾位
職等 | 審核金額 |
主管 | 0 - 49999 |
會計 | 50000 - 99999 |
老闆 | 10000以上 |
主管會處理0 - 49999元,金額超過這個範圍,給會計處理。
會計處理5萬以上,10萬以下,金額超過這個範圍,給老闆處理。
老闆只處理10萬元以上,10萬元以下,老闆不處理,給主管處理。
有看出這個環狀結果嗎,主管->會計->老闆->主管。
類別圖
Request是報價需求,有編號與價錢二個成員屬性。
Approver是抽象類別,中文意思是簽呈者,成員屬性有nextApprover設定下一個處理的人,process()是抽象方法,繼承的子類別一定要覆寫。
Approver子類別如下ManagerApprover, AccountApprover, BossApprover,分別是主管簽呈、會計簽呈、老闆簽呈。
Request需求
有編號與價錢二個成員屬性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Request {
private int id;
private int price;
public Request(int id, int price) {
this.id = id;
this.price = price;
}
public int getId() {
return id;
}
public int getPrice() {
return price;
}
}
Approver
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class Approver {
private String name;
// nextApprover設定下一個處理的人
protected Approver nextApprover;
// 設定簽呈人的名字
public Approver(String name) {
this.name = name;
}
// 抽象方法,子類別一定要實作,處理需求
public abstract void process(Request request);
public String getName() {
return name;
}
// 設定下一個處理的人
public void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
}
Approver子類別
子類別都要覆寫process()抽象方法
主管
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ManagerApprover extends Approver{
public ManagerApprover(String name) {
super(name);
}
@Override
public void process(Request request) {
// 處理金額範圍
if (request.getPrice() > 0 && request.getPrice() <= 49999) {
System.out.println("需求編號 =" + request.getId() +"被" + getName() + "處理");
} else {
nextApprover.process(request); // 給下一個人處理
}
}
}
會計
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AccountApprover extends Approver{
public AccountApprover(String name) {
super(name);
}
@Override
public void process(Request request) {
// 處理金額範圍
if (request.getPrice() >= 50000 && request.getPrice() <= 99999) {
System.out.println("需求編號 =" + request.getId() +"被" + getName() + "處理");
} else {
nextApprover.process(request); // 給下一個人處理
}
}
}
老闆
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class BossApprover extends Approver{
public BossApprover(String name) {
super(name);
}
@Override
public void process(Request request) {
// 處理金額範圍
if (request.getPrice() >= 100000) {
System.out.println("需求編號 =" + request.getId() +"被" + getName() + "處理");
} else {
nextApprover.process(request); // 給下一個人處理
}
}
}
main主程式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Test {
public static void main(String[] args) {
// 建立需求
Request request1 = new Request(1, 200000);
Request request2 = new Request(2, 3500);
Request request3 = new Request(3, 50000);
// 建立簽呈的人
ManagerApprover managerApprover = new ManagerApprover("主管");
AccountApprover accountApprover = new AccountApprover("會計");
BossApprover bossApprover = new BossApprover("老闆");
// 設定下一個處理的人
managerApprover.setApprover(accountApprover);
accountApprover.setApprover(bossApprover);
// 設定若金額太小,下一個可以處理的人是誰,要形成環狀
bossApprover.setApprover(managerApprover);
// 處理需求
managerApprover.process(request1);
// 測試金額3500,會不會給下一個人處理
bossApprover.process(request2);
managerApprover.process(request3);
}
}
需求編號 =1被老闆處理
需求編號 =2被主管處理
需求編號 =3被會計處理