Android设计模式-8-责任链模式
2018-06-06 本文已影响50人
今阳说
1. 定义
将一个请求从链式的首端发出,沿着链的路径依次传递给每个节点对象,直到有对象处理这个请求为止,使多个对象都有机会处理请求,从而避免了请求发送者与接收者之间的耦合关系,使编程更有灵活性。
2. 使用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
- 可动态指定一组对象处理请求。
3. 优缺点
- 优点:
- 降低耦合度,将请求的发送者和接收者解耦
- 简化了对象,使对象不需要知道链的结构
- 增强给对象指派职责的灵活性, 通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 缺点:
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用
- 可能不容易观察运行时的特征,有碍于除错。
4. Android源码中的使用
android中的触摸事件的传递机制,就属于责任链模式,从activity到phoneWindow,再到我们自己的rootView及子view层层传递,知道有view消费该事件
5. 实例演示
以公司中申请报销费用为例,不同领导可以批放不同额度的报销,职员提交申请后,申请由下往上传递,直到有领导处理该申请
- 创建一个领导基类
abstract class Leader {
protected Leader nextLeader;//上一级领导处理者
/**
* 处理报账请求
*
* @param money 能批复的报账额度
*/
public final void handleRequest(int money) {
if (money <= limit()) {
handle(money);
} else {
if (nextLeader != null) {
nextLeader.handleRequest(money);
}
}
}
/**
* 自身能批复的额度权限
*
* @return 额度
*/
public abstract int limit();
/**
* 处理报账行为
*
* @param money 具体金额
*/
public abstract void handle(int money);
}
- 创建不同层级的领导实现类,依次为组长,主管,经理,老板
//组长
class GroupLeader extends Leader {
@Override
public int limit() {
return 1000;
}
@Override
public void handle(int money) {
LjyLogUtil.i("组长批准报销" + money + "元");
}
}
//主管
class Director extends Leader {
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
LjyLogUtil.i("主管批准报销" + money + "元");
}
}
//经理
class Manager extends Leader {
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
LjyLogUtil.i("经理批准报销" + money + "元");
}
}
//老板
class Boss extends Leader {
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
LjyLogUtil.i("老板批准报销" + money + "元");
}
}
- 创建不同的领导对象,关联责任链,进行报销申请
private void methodDutyChainPattern() {
//申请报销费用为例
//1.构建领导对象
GroupLeader groupLeader = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
//2.设置上一级领导
groupLeader.nextLeader = director;
director.nextLeader = manager;
manager.nextLeader = boss;
//3.发起报账申请,从最低级开始
LjyLogUtil.i("---------审批范围-----------\n组长<=1000,主管<=5000,经理<=10000,老板>10000\n----------------");
int num1 = 800;
LjyLogUtil.i("-----------小智申请报销" + num1 + "元-----------");
groupLeader.handleRequest(num1);
int num2 = 6800;
LjyLogUtil.i("-----------小米申请报销" + num2 + "元-----------");
groupLeader.handleRequest(num2);
int num3 = 18000;
LjyLogUtil.i("-----------小明申请报销" + num3 + "元-----------");
groupLeader.handleRequest(num3);
}