八、责任链设计模式
来源:互联网 发布:java开发自我介绍范文 编辑:程序博客网 时间:2024/04/30 06:19
1. 责任链模式介绍
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
考虑到如下情景:
小李要出差,出差之后,小李要报销经费,小李申请了50000块的经费。
首先向组长提出,组长,他只能报销2000元以内的。组长把小李的请求向主管提出。
主管收到申请后,主管说他也无法批准,他只能批准5000以内的,所以主管把请求又递交给了总经理。
总经理收到请求后,他只能批准10000以内的,所以主管把请求又递交给了老板。
老板收到请求后,把小李的请求给处理了。
以上请求就是一个责任链模式,发出请求者并不知道谁会来处理请求,每个领导会根据自己的职责范围,来判断是处理还是把请求递交给更高级别的领导。只要有领导处理了,传递就结束了。
2. 责任链模式使用场景
- 多个对象可以处理同一请求,单具体由哪个对象处理则在运行时动态决定的。
- 在请求矗立着不明确的情况下向多个对象中的一个提交一个请求。
- 需要动态指定一组对象处理请求。
3. 责任链模式UML类图
4. 责任链模式简单实现
情景描述:介绍里面描述的申请经费案例。
包结构:
(1) 首先声明一个抽象的老板类:
public abstract class Leader { protected Leader nextHandler;//上一级领导处理者 public void handleRequest(int money) { if (money <= limit()) { handleMoney(money); } else { if (nextHandler != null) { nextHandler.handleRequest(money); } } } //处理 protected abstract void handleMoney(int money); //每一级领导能够批准的额度 protected abstract int limit(); }
在上述抽象类中,发起请求时,调用handleRequest()方法,步骤如下:
在handleRequest方法中,首先判断传递进来的money是否小于当前领导能够批准的额度。这个额度由 limit()这个方法返回,limit()是一个抽象方法,由具体的领导实现。
如果money小于当前领导所能处理的额度,调用handleMoney(money)方法,handleMOney(money)也是一个抽喜类,由具体的领导类实现。
如果money大于当前领导所能处理的额度,调用上一级领导的handleReqeust()方法。
重复以上1、2、3步骤,直到结束。
(2)具体的领导类:Boos,DirectorLeader,GroupLeader,ManagerLeader:
public class Boss extends Leader { @Override protected void handleMoney(int money) { System.out.println("老板报销: " + money); } @Override protected int limit() { return Integer.MAX_VALUE; }}
(3)测试类:
public class Person { public static void main(String[] args) { //构造各个级别领导 GroupLeader groupLeader = new GroupLeader(); DirectorLeader directorLeader = new DirectorLeader(); ManagerLeader managerLeader = new ManagerLeader(); Boss boss = new Boss(); //设置上一级领导处理对象 groupLeader.nextHandler = directorLeader; directorLeader.nextHandler = managerLeader; managerLeader.nextHandler = boss; //申请报销 groupLeader.handleRequest(50000); }}
- 对于责任链来说,一个请求最终只有两种情况:一是被某个处理对象处理,另一个是所有的对象均为对其处理。 对于前一种情况,我们称该对象为纯的责任链,对于后一种情况我们称为不纯的责任链,在实际应用中,我们所见的责任链模式大多为不纯的责任链模式。
5. 责任链模式在Android系统中
android触摸事件流程是一个典型的责任链模式,具体网上有很多优质的文章介绍,这里就不做赘述了。
这里推荐一篇个人决定不错的文章。
android触摸事件处理流程
6. 责任链模式在Android开发中
责任链模式可以替代各种分支和条件判断语句,这里就不做具体举例。
7. 总结
- 优点:
- 可以对请求者和处理者关系解耦,提高代码的灵活性。
- 缺点:
- 对链中请求处理的遍历,如果处理者太多,那么遍历必定会影响性能。
- 八、责任链设计模式
- iOS设计模式(八) 责任链模式
- 面向对象的设计模式(八),责任链模式
- Android设计模式(八)-责任链模式
- 责任链设计模式
- 责任链设计模式
- 设计模式---责任链
- 责任链设计模式
- 设计模式----责任链
- 设计模式-责任链
- 责任链设计模式
- 责任链设计模式
- 设计模式:责任链
- [设计]责任链模式
- 设计模式--责任链
- 责任链设计模式
- 设计模式-责任链设计
- 设计模式----责任链模式
- Android SQLite 升级数据库,在原有数据库的基础上添加一列
- leetcode-338. Counting Bits
- 第一章 JAVA入门(javad的平台无关性)
- oracle 分析函数应用
- Java继承机制的初始化顺序+静态动态绑定
- 八、责任链设计模式
- 练习三 1016
- Swift初始化方法顺序
- 2.头文件<bits/stdc++.h>
- 第一章 JAVA入门(初识java标准版,企业版,精简版)
- MATLAB7.0在window7下的安装
- redis数据结构--下
- c++ stacks
- 类的初始化顺序