标签:
责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。
有人想请假,小组长只能审批小于等于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,成功!
优点
调用者不需知道具体谁来处理请求,也不知道链的具体结构,降低了节点域节点的耦合度;可在运行时动态修改链中的对象职责,增强了给对象指派职责的灵活性。
缺点
没有明确的接收者,可能传到链的最后,也没得到正确的处理。
标签:
原文地址:http://www.cnblogs.com/a294098789/p/5627861.html