1. 程式人生 > >【行為型模式】《大話設計模式》——讀後感 (16)加薪非要老板批?——職責鏈模式

【行為型模式】《大話設計模式》——讀後感 (16)加薪非要老板批?——職責鏈模式

技術 值方法 param images span pack com 適用場景 rri

職責鏈模式(Chain of Responsibility):使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。

技術分享

適用場景:

1、有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定;

2、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求;

3、處理一個請求的對象集合應被動態指定。

Handler:

package com.sjmx.responsibility.application;

public abstract class Handler {
    /**
     * 持有下一個處理請求的對象
     
*/ protected Handler successor = null; /** * 取值方法 */ public Handler getSuccessor() { return successor; } /** * 設置下一個處理請求的對象 */ public void setSuccessor(Handler successor) { this.successor = successor; } /** * 處理聚餐費用的申請 * *
@param user * 申請人 * @param fee * 申請的錢數 * @return 成功或失敗的具體通知 */ public abstract String handleFeeRequest(String user, double fee); }

ProjectManager:

package com.sjmx.responsibility.application;

public class ProjectManager extends Handler {

    @Override
    
public String handleFeeRequest(String user, double fee) { String str = ""; // 項目經理權限比較小,只能在500以內 if (fee < 500) { // 為了測試,簡單點,只同意張三的請求 if ("張三".equals(user)) { str = "成功:項目經理同意【" + user + "】的聚餐費用,金額為" + fee + "元"; } else { // 其他人一律不同意 str = "失敗:項目經理不同意【" + user + "】的聚餐費用,金額為" + fee + "元"; } } else { // 超過500,繼續傳遞給級別更高的人處理 if (getSuccessor() != null) { return getSuccessor().handleFeeRequest(user, fee); } } return str; } }

DeptManager:

package com.sjmx.responsibility.application;

public class DeptManager extends Handler {

    @Override
    public String handleFeeRequest(String user, double fee) {

        String str = "";
        // 部門經理的權限只能在1000以內
        if (fee < 1000) {
            // 為了測試,簡單點,只同意張三的請求
            if ("張三".equals(user)) {
                str = "成功:部門經理同意【" + user + "】的聚餐費用,金額為" + fee + "元";
            } else {
                // 其他人一律不同意
                str = "失敗:部門經理不同意【" + user + "】的聚餐費用,金額為" + fee + "元";
            }
        } else {
            // 超過1000,繼續傳遞給級別更高的人處理
            if (getSuccessor() != null) {
                return getSuccessor().handleFeeRequest(user, fee);
            }
        }
        return str;
    }

}

GeneralManager:

package com.sjmx.responsibility.application;

public class GeneralManager extends Handler {

    @Override
    public String handleFeeRequest(String user, double fee) {

        String str = "";
        // 總經理的權限很大,只要請求到了這裏,他都可以處理
        if (fee >= 1000) {
            // 為了測試,簡單點,只同意張三的請求
            if ("張三".equals(user)) {
                str = "成功:總經理同意【" + user + "】的聚餐費用,金額為" + fee + "元";
            } else {
                // 其他人一律不同意
                str = "失敗:總經理不同意【" + user + "】的聚餐費用,金額為" + fee + "元";
            }
        } else {
            // 如果還有後繼的處理對象,繼續傳遞
            if (getSuccessor() != null) {
                return getSuccessor().handleFeeRequest(user, fee);
            }
        }
        return str;
    }

}

客戶端:

package com.sjmx.responsibility.application;

public class Client {
     public static void main(String[] args) {  
            //先要組裝責任鏈  
            Handler h1 = new GeneralManager();  
            Handler h2 = new DeptManager();  
            Handler h3 = new ProjectManager();  
            h3.setSuccessor(h2);  
            h2.setSuccessor(h1);  
              
            //開始測試  
            String test1 = h3.handleFeeRequest("張三", 300);  
            System.out.println("test1 = " + test1);  
            
            String test2 = h3.handleFeeRequest("李四", 300);  
            System.out.println("test2 = " + test2);  
            System.out.println("---------------------------------------");  
              
            String test3 = h3.handleFeeRequest("張三", 700);  
            System.out.println("test3 = " + test3);  
            String test4 = h3.handleFeeRequest("李四", 700);  
            System.out.println("test4 = " + test4);  
            System.out.println("---------------------------------------");  
              
            String test5 = h3.handleFeeRequest("張三", 1500);  
            System.out.println("test5 = " + test5);  
            String test6 = h3.handleFeeRequest("李四", 1500);  
            System.out.println("test6 = " + test6);  
        }  
      
}

test1 = 成功:項目經理同意【張三】的聚餐費用,金額為300.0元
test2 = 失敗:項目經理不同意【李四】的聚餐費用,金額為300.0元
---------------------------------------
test3 = 成功:部門經理同意【張三】的聚餐費用,金額為700.0元
test4 = 失敗:部門經理不同意【李四】的聚餐費用,金額為700.0元
---------------------------------------
test5 = 成功:總經理同意【張三】的聚餐費用,金額為1500.0元
test6 = 失敗:總經理不同意【李四】的聚餐費用,金額為1500.0元

【行為型模式】《大話設計模式》——讀後感 (16)加薪非要老板批?——職責鏈模式