1. 程式人生 > >Android 責任鏈模式

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 原始碼設計模式解析與實戰 第二版

本人鄭重宣告,本部落格所編文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。