責任鏈模式應用場景
一個事件要經過多個對象的處理,例如公司的審批流程、軟件開發中的異常流程處理、前端頁面的請求流程處理等,都可以考慮用責任鏈模式。
責任鏈模式的實現
現在讓我們用公司的審批流程來作爲場景舉例實現。
根據上圖展示,我們來模擬一個最簡單的場景:某公司制定了出差報銷的審批流程,有三個審批角色,員工(1000元以下的審批權限)、經理(5000元)和CEO(10000元)。
那麼,這個時候,我們就可以抽象出一條審批流程鏈,想象以下,將流程鏈比作一條河流,每一層角色根據金額來判斷是否由自己來處理,不能處理就將任務交換給河流,並傳遞到下一位來處理。
所以,首先我們來定義一條抽象的責任鏈類
/**
* @Author hezhan
* @Date 2019/11/19 10:02
* 審批人抽象類
*/
public abstract class Approver {
protected String name;// 抽象出審批人的姓名
protected Approver nextApprover;// 下一個審批人,更高級領導
public Approver(String name){
this.name = name;
}
public Approver setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
return this.nextApprover;
}
/**
* 每一步流程內要處理的邏輯
* @param amount
*/
public abstract void approve(int amount);
}
然後再分別構建處理事件的不同角色
/**
* @Author hezhan
* @Date 2019/11/19 9:55
* 普通員工類
*/
public class Staff extends Approver {
public Staff(String name) {
super(name);
}
@Override
public void approve(int amount) {
if (amount <= 1000){
System.out.println("審批通過。【員工:" + name + "】");
} else {
System.out.println("無權審批,升級處理。【員工" + name + "】");
this.nextApprover.approve(amount);
}
}
}
``
```java
/**
* @Author hezhan
* @Date 2019/11/19 10:11
* 經理類
*/
public class Manager extends Approver {
public Manager(String name) {
super(name);
}
@Override
public void approve(int amount) {
if (amount <= 5000){
System.out.println("審批通過。經理【" + name + "】");
} else {
System.out.println("無權審批,升級處理。【經理" + name + "】");
this.nextApprover.approve(amount);
}
}
}
/**
* @Author hezhan
* @Date 2019/11/19 10:14
* CEO類
*/
public class CEO extends Approver{
public CEO(String name) {
super(name);
}
@Override
public void approve(int amount) {
if (amount <= 10000){
System.out.println("審批通過。【CEO:" + name + "】");
} else {
System.out.println("駁回申請。【CEO" + name + "】");
}
}
}
最後我們在做一下測試
/**
* @Author hezhan
* @Date 2019/11/19 10:18
* 責任鏈設計模式測試類--模擬公司流程審批,
* 如果資金少於1000元,則員工審批,
* 如果資金少於5000元,則經理審批,
* 如果資金少於10000元,則CEO審批,否則駁回申請。
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ResponsibilityTest {
@Test
public void test(){
Approver approver = new Staff("小張");
//下一步就是創建一條責任鏈或者流程
approver.setNextApprover(new Manager("老李")).setNextApprover(new CEO("劉總"));//這一步可以用工廠模式創建一條責任鏈
//1000元直接找員工審批
approver.approve(1000);
//4000元要找經理審批
approver.approve(4000);
//9000元要找CEO審批
approver.approve(9000);
//超過10000元就駁回申請
approver.approve(20000);
}
}
測試結果爲:
至此,一個簡單的責任鏈模式就構造完成了。