Android 責任鏈模式
文章目錄
1、責任鏈模式簡介
將每個節點看作是一個物件,每一個物件擁有不同的處理邏輯,將一個請求從鏈式的首段發出,沿著鏈的路徑依次傳遞給每一個節點物件,直至有物件處理這個請求為止。
2、責任鏈的定義
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。
3、責任鏈的使用場景
1)多個物件可以處理同一請求,但是具體哪個物件進行處理則在執行時動態決定。
2)在請求處理者不明確的情況下向多個現象中的一個提交一個請求。
3)需要動態指定一組物件處理請求。
4、責任鏈模式的UML類圖
5、責任鏈模式的簡單實現
1)示例簡介
小A 出差 花費 5 萬元,需要報銷。
小A 找到組長 報銷,然而 組長 只能報銷 5000 以內數目, 於是組長找到部長報銷
部長一看 自己也只有 一萬元 報銷許可權,於是找到 經理報銷
經理一看自己只有兩萬一下報銷數目,於是找到老闆報銷
老闆一看是報銷單,於是給與報銷
2)示例分析
我們可以看到 A 是事件發起者,而老闆是最終解決者,他們並沒有直接聯絡。
責任鏈模式很好的將請求的發起者與處理者解耦。
3)程式碼結構
1)Leader 是一個 抽象類 ,做了兩件事情
(1)定義兩個抽象方法,來確定一個領導者 應該有的屬性和行為 及 批覆金額大小,批覆行為
(2)宣告一個 判斷該領導是否有 批覆當前金額的能力
2)GroupLeader 繼承Leader 類,用於處理自身範圍內 報賬
3)Director 繼承Leader 類,用於處理自身範圍內 報賬
4) Manager 繼承Leader 類,用於處理自身範圍內 報賬
5) Boss 繼承Leader 類,用於處理自身範圍內 報賬
6)MainActivity 發起報賬請求
4) Leader 檔案
package com.example.lum.myleadermodule;
/**
* Created by lum on 2018/11/24.
*/
public abstract class Leader {
protected Leader nextHandler; //上一級領導處理者
//處理報賬請求
public final void handleRequest(int money) {
if (money <= limit()) {
handle(money);
} else {
if (null != nextHandler) {
nextHandler.handleRequest(money);
}
}
}
//自身能批覆的額度, 不同階級領導批覆不一樣
public abstract int limit();
//處理報賬行為, 不同階級領導 都可以在一定範圍進行批覆
public abstract void handle(int money);
}
5)GroupLeader 檔案
package com.example.lum.myleadermodule;
import android.util.Log;
/**
* Created by lum on 2018/11/24.
*/
public class GroupLeader extends Leader {
private String TAG = "GroupLeader: ";
@Override
public int limit() { //組長只能批覆 一千以內
return 1000;
}
@Override
public void handle(int money) {
Log.i(TAG,"組長批覆報銷: " + money + "元");
}
}
6)、Director 檔案
package com.example.lum.myleadermodule;
import android.util.Log;
/**
* Created by lum on 2018/11/24.
*/
public class Director extends Leader {
private String TAG = "Director: ";
@Override
public int limit() { //部長只能批覆 5000 以內
return 5000;
}
@Override
public void handle(int money) {
Log.i(TAG,"部長批覆報銷: " + money + "元");
}
}
7)、Manager 檔案
package com.example.lum.myleadermodule;
import android.util.Log;
/**
* Created by lum on 2018/11/24.
*/
public class Manager extends Leader {
private String TAG = "Manager: ";
@Override
public int limit() { //經理只能批覆 10000 以內
return 10000;
}
@Override
public void handle(int money) {
Log.i(TAG,"經理批覆報銷: " + money + "元");
}
}
8)Boss 檔案
package com.example.lum.myleadermodule;
import android.util.Log;
/**
* Created by lum on 2018/11/24.
*/
public class Boss extends Leader {
private String TAG = "Boss: ";
@Override
public int limit() { //老闆能批覆 到公司破產
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
Log.i(TAG,"老闆批覆報銷: " + money + "元");
}
}
9)、MainActivity 檔案
package com.example.lum.myleadermodule;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity: ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//構造各個領導物件
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;
//A 發起報賬申請
Log.i(TAG,"小A 發起報賬請求" );
groupLeader.handleRequest(50000);
}
}
10)列印 log
文獻參考:
Android 原始碼設計模式解析與實戰 第二版
本人鄭重宣告,本部落格所編文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。