前言
Android的設計模式系列文章介紹,歡迎關注,持續更新中:
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式
1.定義
一個請求沿著一條“鏈”傳遞,直到該“鏈”上的某個處理者處理它為止。
2.介紹
- 責任鏈模式屬于行為型模式。
- 多個對象中,每個對象都持有下一個對象的引用,這就構成了鏈這種結構。
- 一個請求通過鏈的頭部,一直往下傳遞到鏈上的每一個結點,直到有某個結點對這個請求做出處理為止,這就是責任鏈模式。
- 責任鏈模式一般分為處理者與請求者。具體的處理者分別處理請求者的行為。
3.UML類圖
角色說明:
- Handler(抽象處理者):抽象類或者接口,定義處理請求的方法以及持有下一個Handler的引用.
- ConcreteHandler1,ConcreteHandler2(具體處理者):實現抽象處理類,對請求進行處理,如果不處理則轉發給下一個處理者.
- Client (客戶端):即要使用責任鏈模式的地方。
4.實現
以送快遞為例,單個快遞員只負責某個片區的快遞,若某個快遞目的地不屬于當前的片區,則交給下一個快遞員來處理,直到有人處理為止。
4.1 創建抽象處理者類
定義處理請求的方法以及持有下一個Handler的引用:
public abstract class Postman {//快遞員抽象類
protected Postman nextPostman;//下一個快遞員
public abstract void handleCourier(String address);//派送快遞
}
4.2 創建具體處理者類
實現抽象處理者類中的方法:
public class BeijingPostman extends Postman {//北京快遞員
@Override
public void handleCourier(String address) {
if (address.equals("Beijing")) {//北京地區的則派送
System.out.println("派送到北京");
return;
} else {//否則交給下一個快遞員去處理
nextPostman.handleCourier(address);
}
}
}
public class ShanghaiPostman extends Postman {//上海快遞員
@Override
public void handleCourier(String address) {
if (address.equals("Shanghai")) {
System.out.println("派送到上海");
return;
} else {
nextPostman.handleCourier(address);
}
}
}
public class GuangzhouPostman extends Postman {//廣州快遞員
@Override
public void handleCourier(String address) {
if (address.equals("Guangzhou")) {
System.out.println("派送到廣州");
return;
} else {
if (nextPostman != null)
nextPostman.handleCourier(address);
}
}
}
4.3 客戶端測試
public void test() {
//創建不同的快遞員對象
Postman beijingPostman = new BeijingPostman();
Postman shanghaiPostman = new ShanghaiPostman();
Postman guangzhouPostman = new GuangzhouPostman();
//創建下一個結點
beijingPostman.nextPostman=shanghaiPostman;
shanghaiPostman.nextPostman=guangzhouPostman;
//處理不同地區的快遞,都是從首結點北京快遞員開始
System.out.println("有一個上海快遞需要派送:");
beijingPostman.handleCourier("Shanghai");
System.out.println("有一個廣州快遞需要派送:");
beijingPostman.handleCourier("Guangzhou");
System.out.println("有一個美國快遞需要派送:");
beijingPostman.handleCourier("America");
}
輸出結果:
有一個上海快遞需要派送:
派送到上海
有一個廣州快遞需要派送:
派送到廣州
有一個美國快遞需要派送:
4.4 說明:
- 上面的請求只是一個簡單的地址字符串,如果是一些復雜的請求,可以封裝成獨立的對象。如:普通快遞和生鮮快遞,生鮮快遞還需快遞員做冷鏈處理等等。
- 請求實際上可以從責任鏈中的任意結點開始,即可以從上海快遞員開始處理也行;
- 責任鏈中的結點順序實際也可以調整,即北京->廣州->上海的順序也行;
- 責任鏈也可以越過某些結點去處理請求,如北京->廣州,越過了上海。
- 對于請求,只有兩種結果:一是某個結點對其進行了處理,如上面例子的上海、廣州快遞,這種叫純的責任鏈;另一個則是所有結點都不進行處理,如美國的快遞,這種叫不純的責任鏈。我們所見到的基本都是不純的責任鏈。
5. 應用場景
- 多個對象處理同一請求時,但是具體由哪個對象去處理需要運行時做判斷。
- 具體處理者不明確的情況下,向這組對象提交了一個請求。
6. 優點
- 代碼的解耦,請求者與處理者的隔離分開。
- 易于擴展,新增處理者往鏈上加結點即可。
7. 缺點
- 責任鏈過長的話,或者鏈上的結點判斷處理時間太長的話會影響性能,特別是遞歸循環的時候。
- 請求有可能遍歷完鏈都得不到處理。
8. Android中的源碼分析
- Android中的事件分發機制就是類似于責任鏈模式,關于事件分發機制,這里先不詳述了,先占個坑,后面另起文章說明。
- 另外,OKhttp中對請求的處理也是用到了責任鏈模式,有興趣的可以去看下OKhttp的源碼。后面有時間也會對OKhttp的源碼進行分析。
相關文章閱讀
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式