Android編程設計模式之責任鏈模式詳解
本文實例講述了Android編程設計模式之責任鏈模式。分享給大家供大家參考,具體如下:
一、介紹
責任鏈模式(Iterator Pattern),是行為型設計模式之一。什么是”鏈“?我們將多個節(jié)點首尾相連所構(gòu)成的模型稱為鏈,比如生活中常見的鎖鏈,就是由一個個圓角長方形的鐵環(huán)串起來的結(jié)構(gòu)。對于鏈式結(jié)構(gòu),每個節(jié)點都可以被拆開再連接,因此,鏈式結(jié)構(gòu)也具有很好的靈活性。將這樣一種結(jié)構(gòu)應用于編程領(lǐng)域,將每一個節(jié)點看作是一個對象,每一個對象擁有不同的處理邏輯,將一個請求從鏈式的首端發(fā)出,沿著鏈的路徑依次傳遞給每一個節(jié)點對象,直至有對象處理這個請求為止,我們將這樣的一種模式稱為責任鏈模式,這樣的解釋是不是更通俗易懂呢?我們還是看看責任鏈模式的標準定義。
二、定義
使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接收者直接的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有對象處理它為止。
三、使用場景
多個對象可以處理同一請求,但具體由哪個對象處理則在運行時動態(tài)決定。
在請求處理者不明確的情況下向多個對象中的一個提交一個請求。
需要動態(tài)指定一組對象處理請求。
四、責任鏈模式的UML類圖
UML類圖:

角色介紹:
Handler:抽象處理者角色,聲明一個請求處理的方法,并在其中保持一個對下一個處理節(jié)點Handler對象的引用。
ConcreteHandler:具體處理者角色,對請求進行處理,如果不能處理則將該請求轉(zhuǎn)發(fā)給下一個節(jié)點上的處理對象。
五、簡單實現(xiàn)
這個例子我覺得很貼切。我們在公司有各種原因需要報銷費用,首先我們要找我們的上級領(lǐng)導去審批,報銷額度如果在領(lǐng)導的權(quán)限范圍內(nèi),那就審批通過,否則領(lǐng)導在找自己的上級去審批,以此類推。
抽象領(lǐng)導類:
public abstract class Leader {
/**
* 上級領(lǐng)導處理者
*/
protected Leader nextHandler;
/**
* 處理報賬請求
*
* @param money 能批復的報賬額度
*
*/
public final void handleRequest(int money){
System.out.println(getLeader());
if(money <=limit()){
handle(money);
}else{
System.out.println("報賬額度不足,提交領(lǐng)導");
if(null != nextHandler){
nextHandler.handleRequest(money);
}
}
}
/**
* 自身能批復的額度權(quán)限
*
* @return 額度
*/
public abstract int limit();
/**
* 處理報賬行為
*
* @param money 具體金額
*/
public abstract void handle(int money);
/**
* 獲取處理者
*
* @return 處理者
*/
public abstract String getLeader();
}
在這個抽象的領(lǐng)導類中只做了兩件事,一是定義了兩個抽象接口方法來確定一個領(lǐng)導者應有的行為和屬性,二是聲明了一個處理報賬請求的方法來確定當前領(lǐng)導是否有能力處理報賬請求,如果沒有這個權(quán)限,則將該請求轉(zhuǎn)發(fā)給上級領(lǐng)導處理。接下來則是各個領(lǐng)導類的實現(xiàn):
組長(額度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 "當前是主管";
}
}
經(jīng)理(額度10000):
public class Manager extends Leader{
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
System.out.println("經(jīng)理批復報銷"+ money +"元");
}
@Override
public String getLeader() {
return "當前是經(jīng)理";
}
}
老板(額度…):
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 "當前是老板";
}
}
發(fā)起申請:
public class Client {
public static void main(String[] args) {
//構(gòu)造各個領(lǐng)導對象
GroupLeader groupLeader = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
//設置上級領(lǐng)導處理者對象
groupLeader.nextHandler = director;
director.nextHandler = manager;
manager.nextHandler = boss;
//發(fā)起報賬申請
groupLeader.handleRequest(8000);
}
}
結(jié)果:
當前是組長 報賬額度不足,提交領(lǐng)導 當前是主管 報賬額度不足,提交領(lǐng)導 當前是經(jīng)理 經(jīng)理批復報銷8000元
責任鏈模式非常靈活,請求的發(fā)起可以從責任鏈的任何一個節(jié)點開始,也可以改變內(nèi)部的傳遞規(guī)則。比如主管不在,我們完全可以跨過主管直接從組長那里轉(zhuǎn)到經(jīng)理。
對于責任鏈中的一個處理者對象,有兩個行為。一是處理請求,二是將請求傳遞到下一節(jié)點,不允許某個處理者對象在處理了請求后又將請求傳送給上一個節(jié)點的情況。
對于一條責任鏈來說,一個請求最終只有兩種情況。一是被某個處理對象所處理,另一個是所有對象均未對其處理,對于前一種情況我們稱為純的責任鏈模式,后一種為不純的責任鏈。實際中大多為不純的責任鏈。
六、Android源碼中的責任鏈模式
1、View事件的分發(fā)處理
ViewGroup事件投遞的遞歸調(diào)用就類似于一條責任鏈,一旦其尋找到責任者,那么將由責任者持有并消費掉該次事件,具體體現(xiàn)在View的onTouchEvent方法中返回值的設置,如果返回false,那么意味著當前的View不會是該次的責任人,將不會對其持有;如果返回true,此時View會持有該事件并不再向外傳遞。
七、總結(jié)
優(yōu)點:
可以對請求者和處理者的關(guān)系解耦,提高代碼的靈活性。
缺點:
每次都需要對鏈中請求處理者遍歷,如果處理者太多那么遍歷必定會影響性能,特別是在一些遞歸調(diào)用者中,要慎用。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設計有所幫助。
相關(guān)文章
Android布局耗時監(jiān)測的三種實現(xiàn)方式
在Android應用開發(fā)中,性能優(yōu)化是一個至關(guān)重要的方面,為了更好地監(jiān)測布局渲染的耗時,我們需要一種可靠的實現(xiàn)方案,本文將介紹三種針對Android布局耗時監(jiān)測的實現(xiàn)方案,幫助開發(fā)者及時發(fā)現(xiàn)并解決布局性能問題,需要的朋友可以參考下2024-03-03
Android onActivityResult和setResult方法詳解及使用
這篇文章主要介紹了Android onActivityResult和setResult方法詳解及使用的相關(guān)資料,這里提供實例,幫助大家學習理解,需要的朋友可以參考下2016-12-12
詳解Android app自動更新總結(jié)(已適配9.0)
這篇文章主要介紹了詳解Android app自動更新總結(jié)(已適配9.0),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
微信小程序—微信跳一跳,Android游戲助手(外掛)使用教程詳解
這篇文章主要介紹了微信小程序—微信跳一跳,Android游戲助手(外掛)使用教程詳解,需要的朋友可以參考下2018-01-01
Android uses-permission權(quán)限列表中文注釋版
Android有一個精心設計的安全模型。每一個應用都有其自己Linux用戶和群組,在單獨的進程和VM上運行,不能影響到其他應用2014-05-05
Android應用中實現(xiàn)選擇本地文件與目錄的實例分享
這篇文章主要介紹了Android應用中實現(xiàn)選擇本地文件與目錄的實例分享,相當于從app內(nèi)呼出的簡易的資源管理器來使用本地資源,需要的朋友可以參考下2016-02-02
Android Studio和阿里云數(shù)據(jù)庫實現(xiàn)一個遠程聊天程序
本文主要介紹了Android Studio和阿里云數(shù)據(jù)庫實現(xiàn)一個遠程聊天程序,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11

