商业广告创意设计,seo网站优化论文,黄骅港金沙滩景区,重庆妇科医院排名前三一、介绍
责任链模式#xff08;Iterator Pattern#xff09;#xff0c;是行为型设计模式之一。什么是”链“#xff1f;我们将多个节点首尾相连所构成的模型称为链#xff0c;比如生活中常见的锁链#xff0c;就是由一个个圆角长方形的铁环串起来的结构。对于链式结构…一、介绍
责任链模式Iterator Pattern是行为型设计模式之一。什么是”链“我们将多个节点首尾相连所构成的模型称为链比如生活中常见的锁链就是由一个个圆角长方形的铁环串起来的结构。对于链式结构每个节点都可以被拆开再连接因此链式结构也具有很好的灵活性。将这样一种结构应用于编程领域将每一个节点看作是一个对象每一个对象拥有不同的处理逻辑将一个请求从链式的首端发出沿着链的路径依次传递给每一个节点对象直至有对象处理这个请求为止我们将这样的一种模式称为责任链模式这样的解释是不是更通俗易懂呢我们还是看看责任链模式的标准定义。
二、定义
使多个对象都有机会处理请求从而避免了请求的发送者和接收者直接的耦合关系。将这些对象连成一条链并沿着这条链传递请求直到有对象处理它为止。
三、使用场景
多个对象可以处理同一请求但具体由哪个对象处理则在运行时动态决定。在请求处理者不明确的情况下向多个对象中的一个提交一个请求。需要动态指定一组对象处理请求。
四、责任链模式的UML类图
UML类图 角色介绍
Handler抽象处理者角色声明一个请求处理的方法并在其中保持一个对下一个处理节点Handler对象的引用。ConcreteHandler具体处理者角色对请求进行处理如果不能处理则将该请求转发给下一个节点上的处理对象。
五、简单实现
这个例子我觉得很贴切。我们在公司有各种原因需要报销费用首先我们要找我们的上级领导去审批报销额度如果在领导的权限范围内那就审批通过否则领导在找自己的上级去审批以此类推。
抽象领导类
public abstract class Leader {/*** 上级领导处理者*/protected Leader nextHandler;/*** 处理报账请求* * param money 能批复的报账额度 * */public final void handleRequest(int money){System.out.println(getLeader());if(money limit()){handle(money);}else{System.out.println(报账额度不足提交领导);if(null ! nextHandler){nextHandler.handleRequest(money);}}}/*** 自身能批复的额度权限* * return 额度*/public abstract int limit();/*** 处理报账行为* * param money 具体金额*/public abstract void handle(int money);/*** 获取处理者* * return 处理者*/public abstract String getLeader();
}
在这个抽象的领导类中只做了两件事一是定义了两个抽象接口方法来确定一个领导者应有的行为和属性二是声明了一个处理报账请求的方法来确定当前领导是否有能力处理报账请求如果没有这个权限则将该请求转发给上级领导处理。接下来则是各个领导类的实现
组长额度1000
public class GroupLeader extends Leader{Overridepublic int limit() {return 1000;}Overridepublic void handle(int money) {System.out.println(组长批复报销 money 元);}Overridepublic String getLeader() {return 当前是组长;}}
主管额度5000
public class Director extends Leader{Overridepublic int limit() {return 5000;}Overridepublic void handle(int money) {System.out.println(主管批复报销 money 元);}Overridepublic String getLeader() {return 当前是主管;}}
经理额度10000
public class Manager extends Leader{Overridepublic int limit() {return 10000;}Overridepublic void handle(int money) {System.out.println(经理批复报销 money 元);}Overridepublic String getLeader() {return 当前是经理;}}
老板额度…
public class Boss extends Leader{Overridepublic int limit() {return Integer.MAX_VALUE;}Overridepublic void handle(int money) {System.out.println(老板批复报销 money 元);}Overridepublic String getLeader() {return 当前是老板;}}
发起申请
public class Client {public static void main(String[] args) {//构造各个领导对象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;//发起报账申请groupLeader.handleRequest(8000);}
}
结果
当前是组长
报账额度不足提交领导
当前是主管
报账额度不足提交领导
当前是经理
经理批复报销8000元
责任链模式非常灵活请求的发起可以从责任链的任何一个节点开始也可以改变内部的传递规则。比如主管不在我们完全可以跨过主管直接从组长那里转到经理。
对于责任链中的一个处理者对象有两个行为。一是处理请求二是将请求传递到下一节点不允许某个处理者对象在处理了请求后又将请求传送给上一个节点的情况。
对于一条责任链来说一个请求最终只有两种情况。一是被某个处理对象所处理另一个是所有对象均未对其处理对于前一种情况我们称为纯的责任链模式后一种为不纯的责任链。实际中大多为不纯的责任链。
六、Android源码中的责任链模式
1、View事件的分发处理
ViewGroup事件投递的递归调用就类似于一条责任链一旦其寻找到责任者那么将由责任者持有并消费掉该次事件具体体现在View的onTouchEvent方法中返回值的设置如果返回false那么意味着当前的View不会是该次的责任人将不会对其持有如果返回true此时View会持有该事件并不再向外传递。
七、总结
优点
可以对请求者和处理者的关系解耦提高代码的灵活性。
缺点
每次都需要对链中请求处理者遍历如果处理者太多那么遍历必定会影响性能特别是在一些递归调用者中要慎用。