设计模式(24)-----责任链模式
Posted 韩思明
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式(24)-----责任链模式相关的知识,希望对你有一定的参考价值。
责任链模式(chain of responsibility)
定义
责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。
UML类图
角色
抽象处理者(Handler)角色 :定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。
具体处理者(ConcreteHandler)角色 :如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。
例子
有人想请假,小组长只能审批小于等于1天的假期,项目经理可以审批小于等于3天的假期,CEO可以审批所有的假期。
Handler
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: Handler.java * @Description: 审批请假抽象类 * @author: Han * @date: 2016年6月29日 下午6:05:46 */ public abstract class Handler { protected Handler handler; public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } //审批方法 public abstract void approve(int day); }
GroupLeader(小组长)
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: GroupLeader.java * @Description: 小组长,能审批的是小于等于1天的请假申请 * @author: Han * @date: 2016年6月29日 下午5:58:29 */ public class GroupLeader extends Handler { @Override public void approve(int day) { if(day <= 1) { System.out.println("小组长审批"); } else { System.out.println("超过了小组长权限,移交上级"); this.getHandler().approve(day); } } }
ProjectManager(项目经理)
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: ProjectManager.java * @Description: 项目经理,能审批的是小于等于3天的请假 * @author: Han * @date: 2016年6月29日 下午6:01:49 */ public class ProjectManager extends Handler { @Override public void approve(int day) { if(day <= 3) { System.out.println("项目经理审批"); } else { System.out.println("超过了项目经理权限,移交上级"); getHandler().approve(day); } } }
CEO
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: CEO.java * @Description: 最后移交到CEO审批 * @author: Han * @date: 2016年6月29日 下午6:03:59 */ public class CEO extends Handler { @Override public void approve(int day) { System.out.println("CEO审批"); } }
客户端
package com.csdhsm.designpattem.chainofresponsibility; public class Solution { public static void main(String[] args) { Handler leader = new GroupLeader(); Handler manager = new ProjectManager(); Handler ceo = new CEO(); //把Handler连成一条链 leader.setHandler(manager); manager.setHandler(ceo); //处理请求 leader.approve(6); } }
结果
OK,成功!
总结
优点
调用者不需知道具体谁来处理请求,也不知道链的具体结构,降低了节点域节点的耦合度;可在运行时动态修改链中的对象职责,增强了给对象指派职责的灵活性。
缺点
没有明确的接收者,可能传到链的最后,也没得到正确的处理。
以上是关于设计模式(24)-----责任链模式的主要内容,如果未能解决你的问题,请参考以下文章