第1章 什麼是責任鏈模式
1-1 什麼是責任鏈模式
責任鏈模式
Chain of Responsibility
- 什麼是責任鏈模式
- 如何實現責任鏈模式
- 責任鏈模式如何解耦
- 責任鏈模式的應用
生活中的COR
- 擊鼓傳花
- 申請折扣
天然的責任鏈:公司層級結構
- CEO
- Vice President
- Director/Manager
- Sales
Handler:Sales->Manager->Director->Vice President->CEO
Client: 老張、王老闆、小王 request
第2章 有求必應的銷售隊伍:怎樣實現責任鏈模式
2-1 有求必應的銷售團隊
- CEO <=55%
- Vice President <=50%
- Director <=40%
- Manager <=30%
- Sales <=5%
/*
* 價格處理人,負責處理客戶折扣申請
*/
public abstract class PriceHandler {
/*
* 直接後繼,用於傳遞請求
*/
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/*
* 處理折扣申請
*/
public abstract void processDiscount(float discount);
}
/*
* 銷售, 可以批准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);
}
}
}
/*
* 銷售經理, 可以批准30%以內的折扣
*/
public class Manager extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount<=0.3){
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
/*
* 銷售總監, 可以批准40%以內的折扣
*/
public class Director extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount<=0.4){
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
/*
* 銷售副總裁, 可以批准50%以內的折扣
*/
public class VicePresident extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount<=0.5){
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
/*
* CEO, 可以批准55%以內的折扣
* 折扣超出55%, 就拒絕申請
*/
public class CEO extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount<=0.55){
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);
}else{
System.out.format("%s拒絕了折扣:%.2f%n", this.getClass().getName(),discount);
}
}
}
2-2 千姿百態的客戶請求
/*
* 客戶,請求折扣
*/
public class Customer {
private PriceHandler priceHandler;
public void setPriceHandler(PriceHandler priceHandler) {
this.priceHandler = priceHandler;
}
public void requestDiscount(float discount){
priceHandler.processDiscount(discount);
}
public static void main(String[] args){
Customer customer = new Customer();
customer.setPriceHandler(PriceHandler.createPriceHandler());
Random rand = new Random();
for(int i=1;i<=100;i++){
System.out.print(i+":");
customer.requestDiscount(rand.nextFloat());
}
}
}
/*
* 價格處理人,負責處理客戶折扣申請
*/
public abstract class PriceHandler {
/*
* 直接後繼,用於傳遞請求
*/
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/*
* 處理折扣申請
*/
public abstract void processDiscount(float discount);
/*
* 創建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;
}
}
2-3 不管怎麼變折扣你得批
加入銷售組長 折扣15%
/*
* 銷售小組長, 可以批准15%以內的折扣
*/
public class Lead extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount<=0.15){
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
/*
* 客戶,請求折扣
*/
public class Customer {
private PriceHandler priceHandler;
public void setPriceHandler(PriceHandler priceHandler) {
this.priceHandler = priceHandler;
}
public void requestDiscount(float discount){
priceHandler.processDiscount(discount);
}
public static void main(String[] args){
Customer customer = new Customer();
customer.setPriceHandler(PriceHandlerFactory.createPriceHandler());
Random rand = new Random();
for(int i=1;i<=100;i++){
System.out.print(i+":");
customer.requestDiscount(rand.nextFloat());
}
}
}
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;
}
}
第3章 剖析責任鏈模式
3-1 剖析責任鏈模式
在責任鏈模式中,作爲請求接收者的多個對象通過對其後繼的引用而連接起來形成一
條鏈。請求在這條鏈上傳遞,直到鏈上某一個接收者處理這個請求。每個接收者都可
以選擇自行處理請求或是向後繼傳遞請求。
依賴於抽象不依賴於具體
發送請求的客戶端並不知道鏈上的哪一個接收者會處理這個請求,從而實現了客戶端
和接收者之間的解耦。
真的好嗎?
- 開閉原則
擴展開放,修改關閉
永遠沒有正確答案,取決於項目實際對降低耦合的要求是什麼,是否有其他替代方案,
根據實際情況取捨而來 - 執行性能
處理器首尾相接,有請求時需要遍歷鏈
時間、內存
awt早期使用責任鏈模式,現在改爲了觀察者模式
第4章 責任鏈模式的實際應用
4-1 責任鏈模式的應用
Exception Handling
main->Method with an exception handler->Method without an exception handler->Method where error occurred
JavaScript Event Model
capture phase(捕獲) -> target phase -> bubbling phase(冒泡)
FilterChain in Web
設計模式和oo的基本原則