Android設計模式之——責任鏈模式

一、介紹

責任鏈模式(Iterator Pattern),是行為型設計模式之一。什么是”鏈“?我們將多個節點首尾相連所構成的模型稱為鏈,比如生活中常見的鎖鏈,就是由一個個圓角長方形的鐵環串起來的結構。對于鏈式結構,每個節點都可以被拆開再連接,因此,鏈式結構也具有很好的靈活性。將這樣一種結構應用于編程領域,將每一個節點看作是一個對象,每一個對象擁有不同的處理邏輯,將一個請求從鏈式的首端發出,沿著鏈的路徑依次傳遞給每一個節點對象,直至有對象處理這個請求為止,我們將這樣的一種模式稱為責任鏈模式,這樣的解釋是不是更通俗易懂呢?我們還是看看責任鏈模式的標準定義。

二、定義

使多個對象都有機會處理請求,從而避免了請求的發送者和接收者直接的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有對象處理它為止。

三、使用場景

  • 多個對象可以處理同一請求,但具體由哪個對象處理則在運行時動態決定。

  • 在請求處理者不明確的情況下向多個對象中的一個提交一個請求。

  • 需要動態指定一組對象處理請求。

四、責任鏈模式的UML類圖

UML類圖:

這里寫圖片描述

角色介紹:

  • Handler:抽象處理者角色,聲明一個請求處理的方法,并在其中保持一個對下一個處理節點Handler對象的引用。

  • ConcreteHandler:具體處理者角色,對請求進行處理,如果不能處理則將該請求轉發給下一個節點上的處理對象。

五、簡單實現

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

抽象領導類:

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{@Overridepublic int limit() {return 1000;}@Overridepublic void handle(int money) {System.out.println("組長批復報銷"+ money +"元");}@Overridepublic String getLeader() {return "當前是組長";}}

主管(額度5000):

public class Director extends Leader{@Overridepublic int limit() {return 5000;}@Overridepublic void handle(int money) {System.out.println("主管批復報銷"+ money +"元");}@Overridepublic String getLeader() {return "當前是主管";}}

經理(額度10000):

public class Manager extends Leader{@Overridepublic int limit() {return 10000;}@Overridepublic void handle(int money) {System.out.println("經理批復報銷"+ money +"元");}@Overridepublic String getLeader() {return "當前是經理";}}

老板(額度…):

public class Boss extends Leader{@Overridepublic int limit() {return Integer.MAX_VALUE;}@Overridepublic void handle(int money) {System.out.println("老板批復報銷"+ money +"元");}@Overridepublic 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元

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

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

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

六、Android源碼中的責任鏈模式

1、View事件的分發處理

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

七、總結

優點:

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

缺點:

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447017.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447017.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447017.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

目前基于區塊鏈的檔案防篡改系統的設計如何實現防篡改

架構設計圖 分析 為了保障檔案數據的安全性和隱私性&#xff0c;存儲檔案附件和檔案屬性存儲加密存儲在私有IPFS集群&#xff0c;檔案的IPFS地址和數字指紋存儲在私有區塊鏈上。公有區塊鏈定期存儲和檢查私有區塊鏈最新不可逆區塊的高度和哈希值&#xff0c;以保障私有區塊鏈上…

IPFS的文件存儲模式

IPFS是如何進行文件存儲的 IPFS采用的索引結構是DHT&#xff08;分布式哈希表&#xff09;&#xff0c;數據結構是MerkleDAG&#xff08;Merkle有向無環圖&#xff09; DHT(分布式哈希表) 參考鏈接MerkleDAG&#xff08;Merkle有向無環圖&#xff09; 參考鏈接MerkleDAG功能…

Android設計模式之——解釋器模式

一、介紹 解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種用的比較少的行為型模式&#xff0c;其提供了一種解釋語言的語法或表達式的方式&#xff0c;該模式定義了一個表達式接口&#xff0c;通過該接口解釋一個特定的上下文。在這么多的設計模式中&#xff0c…

在Docker里面安裝Ubuntu,并且使用ssh進行連接

創建Ubuntu鏡像 1&#xff0c;拉取Ubuntu系統的鏡像 docker pull ubuntu2、查看拉取是否成功 docker images3&#xff0c;運行容器 docker run --name 新建的容器的名字 -ti -v /AAA:/BBB -d -p 3316:22 ubuntu(這個是鏡像的名字)宿主機根目錄中的AAA文件夾就映射到了容器…

Android設計模式之——命令模式

一、介紹 命令模式&#xff08;Command Pattern&#xff09;&#xff0c;是行為型設計模式之一。命令模式相對于其他的設計模式來說并沒有那么多的條條框框&#xff0c;其實它不是一個很”規范“的模式&#xff0c;不過&#xff0c;就是基于這一點&#xff0c;命令模式相對于其…

C++ 序列化和反序列化學習

定義 程序員在編寫應用程序的時候往往需要將程序的某些數據存儲在內存中&#xff0c;然后將其寫入某個文件或是將它傳輸到網絡中的另一臺計算機上以實現通訊。這些過程將會涉及到程序數據轉化成能被存儲并傳輸的格式&#xff0c;因此被稱為“序列化”&#xff08;Serializatio…

Android設計模式之——觀察者模式

一、介紹 觀察者模式是一個使用率非常高的模式&#xff0c;它最常用的地方是GUI系統、訂閱——發布系統。因為這個模式的一個重要作用就是解耦&#xff0c;將被觀察者和觀察者解耦&#xff0c;使得它們之間的依賴性更小&#xff0c;甚至做到毫無依賴。以GUI系統來說&#xff0…

Android設計模式之——備忘錄模式

一、介紹 備忘錄模式是一種行為模式&#xff0c;該模式用于保存對象當前狀態&#xff0c;并且在之后可以再次恢復到此狀態&#xff0c;這有點像我們平時說的”后悔藥“。備忘錄模式實現的方式需要保證被保存的對象狀態不能被對象從外部訪問&#xff0c;目的是為了保護好被保存…

c++ memory 頭文件詳細介紹

類 指針特征 pointer_traits (C11) 提供關于指針式類型的信息 (類模板) 垃圾收集器支持 pointer_safety (C11) 列出指針安全模式 (枚舉) 分配器 allocator 默認的分配器 (類模板) allocator_traits (C11) 提供關于分配器類型的信息 (類模板) allocator_arg_t (C11) 標簽類型…

C++ using的三種使用策略以及具體的用法

Using的使用方法 1&#xff0c;命名空間的使用 為了防止代碼沖突&#xff0c;都會使用到命名空間。假設這樣一種情況&#xff0c;當一個班上有兩個名叫 Zara 的學生時&#xff0c;為了明確區分他們&#xff0c;我們在使用名字之外&#xff0c;不得不使用一些額外的信息&#…

Android設計模式之——迭代器模式

一、介紹 迭代器模式&#xff08;Iterator Pattern&#xff09;又稱為游標&#xff08;Cursor&#xff09;模式&#xff0c;是行為型設計模式之一。迭代器模式算是一個比較古老的設計模式&#xff0c;其源于對容器的訪問&#xff0c;比如Java中的List、Map、數組等&#xff0c…

Android設計模式之——模板方法模式

一、介紹 在面向對象開發過程中&#xff0c;通常會遇到這樣的一個問題&#xff0c;我們知道一個算法所需的關鍵步驟&#xff0c;并確定了這些步驟的執行順序&#xff0c;但是&#xff0c;某些步驟的具體實現是未知的&#xff0c;或者說某些步驟的實現是會隨著環境的變化而改變…

Android設計模式之——訪問者模式

一、介紹 訪問者模式是一種將數據操作與數據結構分離的設計模式&#xff0c;它是《設計模式》中23種設計模式中最復雜的一個&#xff0c;但它的使用頻率并不高&#xff0c;正如《設計模式》的作者GOF對訪問者模式的描述&#xff1a;大多數情況下&#xff0c;你不需要使用訪問者…

C++類模板template <class T>簡單使用方法

一個簡單的例子 兩個數比大小 如果兩個數都是int類型 class Compare_int { public :Compare(int a,int b){xa;yb;}int max( ){return (x>y)?x:y;}int min( ){return (x<y)?x:y;} private :int x,y; }; 如果兩個數是float類型 class Compare_float { public :Compare(…

Android設計模式之——中介者模式

一、介紹 中介者模式&#xff08;Mediator Pattern&#xff09;也稱為調解者模式或調停者模式&#xff0c;Mediator本身就有調停者和調解者的意思。 在日常生活中調停者或調解者這個角色我們見得比較多的是“和事老”&#xff0c;也就是說調解兩個有爭端的人的角色&#xff0…

C++智能指針中unique_ptr部分內容的講解

參考鏈接 std::unique_ptr 介紹 定義位于頭文件<memory>std::unique_ptr 是通過指針占有并管理另一對象&#xff0c;并在 unique_ptr 離開作用域時釋放該對象的智能指針。 在下列兩者之一發生時用關聯的刪除器釋放對象&#xff1a;1&#xff0c;銷毀了管理的 unique_pt…

Java基礎——Java多線程中sleep()、wait()和notify()

一、sleep()sleep()方法源碼&#xff1a;/** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subject to * the precision and accuracy of system timers and schedulers. The thread * does …

Key_handle的學習

代碼 一切盡在不言中 #pragma once#include "common/common.h" #include "sdf/sdf.h"#include <memory>namespace sdf {namespace algorithm {class KeyHandle {public:using erased_internal_data_t char; //使用erased_internal_data_t等效于ch…

Java基礎——虛擬機結構

一、Java平臺結構圖二、JVM、JRE和JDK關系JVM&#xff1a;Java Virtual Machine&#xff08;Java虛擬機&#xff09;&#xff0c;負責執行符合規范的Class文件 JRE&#xff1a; Java Runtime Environment &#xff08;java運行環境&#xff09;&#xff0c;包含JVM和類庫 JDK&a…

解決 SSH Connection closed by foreign host 問題

用 Xshell 連接服務器總是報錯 : Connection closed by foreign host.Disconnected from remote host... 原因可能是 SSH 服務器沒設置保活時間間隔 , 具體設置如下 : 操作 # vim /etc/ssh/sshd_config 添加兩行 , 或去掉注釋 : ClientAliveInterval 60ClientAliveCountMax…