責任鏈模式(Chain of Responsibility Pattern)使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止。java
責任鏈模式包含一下角色:數據庫
Handler
: 抽象處理者。定義出一個處理請求的接口。若是須要,接口能夠定義 出一個方法以設定和返回對下家的引用。這個角色一般由一個Java抽象類或者Java接口實現。ConcreteHandler
:具體處理者。具體處理者接到請求後,能夠選擇將請求處理掉,或者將請求傳給下家。因爲具體處理者持有對下家的引用,所以,若是須要,具體處理者能夠訪問下家。Client
:客戶類下面咱們以一個簡單的請假做爲示例。假設請假一天,項目經理處理就能處理,三天之類歸項目總監處理,七天內歸老闆處理,請假不容許超過七天。 抽象處理者ide
public abstract class AbstractHandler {
/** * 下一個處理對象 */
private AbstractHandler next;
/** * 處理請假 * * @param leaveDays 天數 * @return 處理結果 */
public final String handleLeave(int leaveDays) {
if (this.getLeaveDays() >= leaveDays) {
return this.handle();
} else {
if (Objects.nonNull(next)) {
return next.handleLeave(leaveDays);
} else {
return "大老闆都不能處理你的假期了~~";
}
}
}
/** * 具體處理 * * @return 處理結果 */
protected abstract String handle();
/** * 每一個處理類能處理的天數,數據可使數據庫獲取,這裏簡單就寫死了 * * @return 請假天數 */
protected abstract Integer getLeaveDays();
/** * 設置下一個處理類 * * @param next */
public void setNext(AbstractHandler next) {
this.next = next;
}
}
複製代碼
具體處理者性能
// 項目經理處理
public class PMHandler extends AbstractHandler {
@Override
protected String handle() {
return "你的請假被項目經理處理了";
}
@Override
protected Integer getLeaveDays() {
return 1;
}
}
// 項目總監處理
public class PDHandler extends AbstractHandler {
@Override
protected String handle() {
return "你的請假被項目總監處理了";
}
@Override
protected Integer getLeaveDays() {
return 3;
}
}
// 大老闆處理
public class BossHandler extends AbstractHandler {
@Override
protected String handle() {
return "你的請假被大老闆處理了";
}
@Override
protected Integer getLeaveDays() {
return 7;
}
}
複製代碼
客戶端this
@Test
public void test() {
PMHandler pmHandler = new PMHandler();
PDHandler pdHandler = new PDHandler();
BossHandler bossHandler = new BossHandler();
pmHandler.setNext(pdHandler);
pdHandler.setNext(bossHandler);
String leaveRes = pmHandler.handleLeave(1);
System.out.println(leaveRes);
String leaveRes1 = pmHandler.handleLeave(3);
System.out.println(leaveRes1);
String leaveRes2 = pmHandler.handleLeave(7);
System.out.println(leaveRes2);
String leaveRes3 = pmHandler.handleLeave(8);
System.out.println(leaveRes3);
}
複製代碼
責任鏈模式有兩種使用形式:純責任鏈模式和不純的責任鏈模式。spa
若是一個類要麼承擔責任處理請求要麼將請求踢給下一個皮球,則被稱爲純責任鏈模式;若是一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱爲不純的責任鏈模式。純的責任鏈模式的實際例子很難找到,通常看到的例子均是不純的責任鏈模式的實現。調試