Java 之 責任鏈

public abstract class Handler {
    /**
     * 持有後繼的責任對象
     */
    protected Handler successor;

    /**
     * 示意處理請求的方法,雖然這個示意方法是沒有傳入參數的 但實際是能夠傳入參數的,根據具體須要來選擇是否傳遞參數
     */
    public abstract void handleRequest();

    /**
     * 取值方法
     */
    public Handler getSuccessor() {
        return successor;
    }

    /**
     * 賦值方法,設置後繼的責任對象
     */
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
}
public class ConcreteHandler extends Handler {

    /**
     * 處理方法,調用此方法處理請求
     */
    @Override
    public void handleRequest() {
        /**
         * 判斷是否有後繼的責任對象 若是有,就轉發請求給後繼的責任對象 若是沒有,則處理請求
         */
        if (getSuccessor() != null) {
            System.out.println("放過請求");
            getSuccessor().handleRequest();
        } else {
            System.out.println("處理請求");
        }
    }

}
public class Client {
    public static void main(String[] args) {
        // 組裝責任鏈
        Handler handler1 = new ConcreteHandler();
        Handler handler2 = new ConcreteHandler();
        handler1.setSuccessor(handler2);
        // 提交請求
        handler1.handleRequest();
    }
}

demojava

public abstract class FeeHandler {
    /**
     * 持有下一個處理請求的對象
     */
    protected FeeHandler successor = null;

    /**
     * 取值方法
     */
    public FeeHandler getSuccessor() {
        return successor;
    }

    /**
     * 設置下一個處理請求的對象
     */
    public void setSuccessor(FeeHandler successor) {
        this.successor = successor;
    }

    /**
     * 處理聚餐費用的申請
     * 
     * @param user
     *            申請人
     * @param fee
     *            申請的錢數
     * @return 成功或失敗的具體通知
     */
    public abstract String handleFeeRequest(String user, double fee);
}


public class ProjectManager extends FeeHandler {

    @Override
    public String handleFeeRequest(String user, double fee) {
        // TODO Auto-generated method stub
     // TODO Auto-generated method stub
        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;
    }

    

}

public class DeptManager extends FeeHandler {

    @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;
    }

}

public class GeneralManager extends FeeHandler {

    @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;
    }

}

public class FeeClient {
    public static void main(String[] args) {
        // 先要組裝責任鏈
        FeeHandler h1 = new GeneralManager();
        FeeHandler h2 = new DeptManager();
        FeeHandler 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);
    }
}

 

學習設計模式強烈推薦的博客:java_my_lifegit

代碼地址:lennon設計模式

相關文章
相關標籤/搜索