設計模式--責任鏈模式

責任鏈模式應用場景

一個事件要經過多個對象的處理,例如公司的審批流程、軟件開發中的異常流程處理、前端頁面的請求流程處理等,都可以考慮用責任鏈模式。

責任鏈模式的實現

現在讓我們用公司的審批流程來作爲場景舉例實現。
流程圖
根據上圖展示,我們來模擬一個最簡單的場景:某公司制定了出差報銷的審批流程,有三個審批角色,員工(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);
    }
}

測試結果爲:
測試結果
至此,一個簡單的責任鏈模式就構造完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章