文章目录
- 1、责任链模式简介
- 2、责任链的定义
- 3、责任链的使用场景
- 4、责任链模式的UML类图
- 5、责任链模式的简单实现
- 1)示例简介
- 2)示例分析
- 3)代码结构
- 4) Leader 文件
- 5)GroupLeader 文件
- 6)、Director 文件
- 7)、Manager 文件
- 8)Boss 文件
- 9)、MainActivity 文件
- 10)打印 log
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 源码设计模式解析与实战 第二版
本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。