什麼是責任鏈模式
定義:
在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
舉例子:
擊鼓傳花:
擊鼓者(Client)+ 花球(Request) + 衆人組成(Handler Chain)
折扣申請:
不同的折扣 level , 需要不同的管理層級的人員(CEO,Vice President,Director,Manager,Sales)來批准。 客戶不在乎是誰處理了這個請求,只要得到它要的折扣就行了。 # 如何實現責任鏈模式
責任鏈模式的實現
UML
PriceHandler.java
package com.imooc.pattern.cor.handler;
/*
* 價格處理人,負責處理客戶折扣申請
*/
public abstract class PriceHandler {
/*
* 直接後繼,用於傳遞請求
*/
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/*
* 處理折扣申請
*/
public abstract void processDiscount(float discount);
}
PriceHandlerFactory.java
package com.imooc.pattern.cor.handler;
public class PriceHandlerFactory {
/*
* 創建PriceHandler的工廠方法
*/
public static PriceHandler createPriceHandler() {
PriceHandler sales = new Sales();
PriceHandler lead = new Lead();
PriceHandler man = new Manager();
PriceHandler dir = new Director();
PriceHandler vp = new VicePresident();
PriceHandler ceo = new CEO();
sales.setSuccessor(lead);
lead.setSuccessor(man);
man.setSuccessor(dir);
dir.setSuccessor(vp);
vp.setSuccessor(ceo);
return sales;
}
}
Sales.java PriceHandler 的一個具體子類實現,其他類似。
package com.imooc.pattern.cor.handler;
/*
* 銷售, 可以批准5%以內的折扣
*/
public class Sales extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount <= 0.05){
System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);
}else{
successor.processDiscount(discount);
}
}
}
責任鏈模式如何解耦
發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
責任鏈模式的應用