Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 《Android源碼設計模式解析與實戰》讀書筆記(九)

《Android源碼設計模式解析與實戰》讀書筆記(九)

編輯:關於android開發

《Android源碼設計模式解析與實戰》讀書筆記(九)


第九章、責任鏈模式

1.定義

責任鏈模式是行為型設計模式之一,它使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關系。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有對象處理它為止。

2.使用場景

1.多個對象可以處理同一請求,但具體由哪個對象處理則在運行時動態決定。
2.在請求處理者不明確的情況下向多個對象中的一個提交請求。
3.需要動態指定一組對象處理請求。

3.簡單實現

這個例子我覺得很貼切。我們在公司有各種原因需要報銷費用,首先我們要找我們的上級領導去審批,報銷額度如果在領導的權限范圍內,那就審批通過,否則領導在找自己的上級去審批,以此類推。

抽象領導類

public abstract class Leader {
    /**
     * 上級領導處理者
     */
    protected Leader nextHandler;

    /**
     * 處理報賬請求
     * 
     * @param money 能批復的報賬額度 
     * 
     */
    public final void handleRequest(int money){
        System.out.println(getLeader());
        if(money <=limit()){
            handle(money);
        }else{
            System.out.println("報賬額度不足,提交領導");
            if(null != nextHandler){
                nextHandler.handleRequest(money);
            }
        }
    }

    /**
     * 自身能批復的額度權限
     * 
     * @return 額度
     */
    public abstract int limit();

    /**
     * 處理報賬行為
     * 
     * @param money 具體金額
     */
    public abstract void handle(int money);

    /**
     * 獲取處理者
     * 
     * @return 處理者
     */
    public abstract String getLeader();
}

組長(額度1000):

public class GroupLeader extends Leader{

    @Override
    public int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        System.out.println("組長批復報銷"+ money +"元");
    }

    @Override
    public String getLeader() {
        return "當前是組長";
    }

} 

主管(額度5000):

public class Director extends Leader{

    @Override
    public int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        System.out.println("主管批復報銷"+ money +"元");
    }

    @Override
    public String getLeader() {
        return "當前是主管";
    }

}

經理(額度10000):

public class Manager extends Leader{

    @Override
    public int limit() {
        return 10000;
    }

    @Override
    public void handle(int money) {
        System.out.println("經理批復報銷"+ money +"元");
    }

    @Override
    public String getLeader() {
        return "當前是經理";
    }

}

老板(額度…):

public class Boss extends Leader{

    @Override
    public int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        System.out.println("老板批復報銷"+ money +"元");
    }

    @Override
    public String getLeader() {
        return "當前是老板";
    }

}

發起申請:

public class Client {
    public static void main(String[] args) {
        //構造各個領導對象
        GroupLeader groupLeader = new GroupLeader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();
        //設置上級領導處理者對象
        groupLeader.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;

        //發起報賬申請
        groupLeader.handleRequest(8000);

    }
}

結果:

當前是組長
報賬額度不足,提交領導
當前是主管
報賬額度不足,提交領導
當前是經理
經理批復報銷8000元

責任鏈模式非常靈活,請求的發起可以從責任鏈的任何一個節點開始,也可以改變內部的傳遞規則。比如主管不在,我們完全可以跨過主管直接從組長那裡轉到經理。

對於責任鏈中的一個處理者對象,有兩個行為。一是處理請求,二是將請求傳遞到下一節點,不允許某個處理者對象在處理了請求後又將請求傳送給上一個節點的情況。

對於一條責任鏈來說,一個請求最終只有兩種情況。一是被某個處理對象所處理,另一個是所有對象均未對其處理,對於前一種情況我們稱為純的責任鏈模式,後一種為不純的責任鏈。實際中大多為不純的責任鏈。

4.Android源碼中的責任鏈模式

1.View事件的分發處理

ViewGroup事件投遞的遞歸調用就類似於一條責任鏈,一旦其尋找到責任者,那麼將由責任者持有並消費掉該次事件,具體體現在View的onTouchEvent方法中返回值的設置,如果返回false,那麼意味著當前的View不會是該次的責任人,將不會對其持有;如果返回true,此時View會持有該事件並不再向外傳遞。

5.總結

1.優點

可以對請求者和處理者的關系解耦,提高代碼的靈活性。

2.缺點

每次都需要對鏈中請求處理者遍歷,如果處理者太多那麼遍歷必定會影響性能,特別是在一些遞歸調用者中,要慎用。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved