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 源码设计模式解析与实战 第二版

本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。

猜你喜欢

转载自blog.csdn.net/qq_27061049/article/details/84442670