概述
責任鏈模式(Chain of Responsibility Pattern)屬于行為型設計模式,它為請求創建了一個處理鏈條,這個鏈條上的所有物件都要對這個請求進行處理,比如我們生活中經常使用的審批流程,當每一個節點審批通過后,發送給下一個節點,如:開發小組長->部門領導->總經理,也可以和java中的鏈表進行類比,
使用場景
- 當一個請求需要進行一系列的處理的時候,如:資料處理程序需要進行資料抽取、清洗、轉換、存盤
- 比如作業流審批場景
如何實作
以審批流程為例,如何進行抽象設計:
- 所有物件都具有審批行為,將其作為一個抽象方法doApproval()
- 所有物件都具有傳遞行為,將需要審批的單據傳遞給下一個審批人,而傳遞的邏輯都是一樣的,所以將傳遞行為定義為一個默認的方法delivery()
- 既然需要傳遞,那么就要知道下一個審批人是誰,所以將下一個審批人作為一個成員屬性
代碼示例
審批人抽象
/**
* 審批人抽象
*/
public abstract class Approver {
private Approver nextApprover;
/**
* 審批邏輯
* @param money
*/
abstract void doApproval(int money);
/**
* 責任鏈傳遞方法
* @param money
*/
protected void delivery(int money) {
if (nextApprover == null) {
System.out.println("結束::沒有下一個審批人了");
} else {
nextApprover.doApproval(money);
}
}
public Approver getNextApprover() {
return nextApprover;
}
public void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
}
小組長審批實作
/**
* 小組長審批實作
*/
public class TeamLeaderApprover extends Approver {
@Override
public void doApproval(int money) {
if (money <= 5000) {
System.out.println("TeamLeader::審批通過::交給下一個審批人");
} else {
System.out.println("TeamLeader::沒有權限::交給下一個審批人");
}
this.delivery(money);
}
}
部門領導審批實作
/**
* 部門領導審批實作
*/
public class DeptLeaderApprover extends Approver {
@Override
public void doApproval(int money) {
if (money <= 10000) {
System.out.println("DeptLeader::審批通過::交給下一個審批人");
} else {
System.out.println("DeptLeader::沒有權限::交給下一個審批人");
}
this.delivery(money);
}
}
CEO審批實作
/**
* CEO審批實作
*/
public class CEOApprover extends Approver {
@Override
public void doApproval(int money) {
if (money <= 20000) {
System.out.println("CEO::這么點錢用不著審批::交給下一個審批人");
} else {
System.out.println("CEO::審批通過::交給下一個審批人");
}
this.delivery(money);
}
}
測驗
/**
* 測驗
*/
public class ChainTest {
public static void main(String[] args) {
TeamLeaderApprover teamLeaderApprover = new TeamLeaderApprover();
DeptLeaderApprover deptLeaderApprover = new DeptLeaderApprover();
CEOApprover ceoApprover = new CEOApprover();
//給當前審批人設定下一個審批人
teamLeaderApprover.setNextApprover(deptLeaderApprover);
deptLeaderApprover.setNextApprover(ceoApprover);
//執行審批行為,自動傳遞
teamLeaderApprover.doApproval(10000);
}
}
運行結果
TeamLeader::沒有權限::交給下一個審批人
DeptLeader::審批通過::交給下一個審批人
CEO::這么點錢用不著審批::交給下一個審批人
結束::沒有下一個審批人了
框架原始碼中的應用
- javax.servlet包中的Filter介面
總結
優點
- 將請求發送者和接受者解耦
- 增加新的請求處理類很方便
- 可以靈活的安排鏈條中每個節點的順序或洗掉某一個節點
缺點
- 當鏈條過長時會對系統性能造成一定影響
- 不能保證請求一定被接收,因為請求發送過去之后沒有反饋
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/502763.html
標籤:設計模式
下一篇:初識設計模式 - 單例模式
