责任链模式(Chain of Responsibility Pattern)
2018-02-27 13:45
274 查看
什么是责任链模式?
责任链模式(Chain of Responsibility Pattern),属于行为型模式。将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一对象。责任链模式涉及到的角色如下所示:
- 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
- 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
优点
由于责任链的创建完全在客户端,因此增加新的具体处理者对原有类库没有任何影响,只需添加新的类,然后在客户端调用时添加即可,符合开闭原则。实现方式
链表方式定义责任链- 本文案例
非链表方式实现责任链
- 通过集合,数组生成责任链更加实用。实际上,很多项目中,每个具体的Handler并不是有开发团队定义的,而是项目上线后由外部单位追加的,使用链表方式定义COR链就很困难。
开发中常见的场景
Java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch。JavaScript语言中,事件的冒泡和捕获机制。Java语言中,事件的处理采用观察者模式。
Servlet开发中,过滤器的链式处理。
Struts2中,拦截器的调用也是经典的责任链模式。
举例
场景:公司里面,请假条的审批过程:
- 如果请假天数小于3天,主任审批。
- 如果请假天数大于等于3天,小于10天,经理审批。
- 如果请假天数大于等于10天,小于30天,总经理审批。
- 如果请假天数大于等于30天,提示拒绝。
类图
代码
业务类package com.match.chainOfResp; /** * 封装请假的基本信息--请假条 * @author Match * */ public class LeaveRequest { private String empName;//员工姓名 private int leaveDays;//请假天数 private String reason;//请假理由 public LeaveRequest(String empName, int leaveDays, String reason) { super(); this.empName = empName; this.leaveDays = leaveDays; this.reason = reason; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public int getLeaveDays() { return leaveDays; } public void setLeaveDays(int leaveDays) { this.leaveDays = leaveDays; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } }
抽象处理者(Handler)角色
package com.match.chainOfResp; /** * 抽象处理者(Handler)角色--领导 * @author Match * */ public abstract class Leader { protected String name;//领导姓名 protected Leader nextLeader;//责任链的后继对象 public Leader(String name) { super(); this.name = name; } /** * 设定责任链上的后继对象 * @param nextLeader */ public void setNextLeader(Leader nextLeader) { this.nextLeader = nextLeader; } /** * 处理请求核心的业务方法 * @param request */ public abstract void handleReauest(LeaveRequest request); }
具体处理者(ConcreteHandler)角色
package com.match.chainOfResp; /** * 具体处理者(ConcreteHandler)角色--主任 * @author Match * */ public class Director extends Leader { public Director(String name) { super(name); } @Override public void handleReauest(LeaveRequest request) { if(request.getLeaveDays()<3) { System.out.println("员工:"+request.getEmpName()+"请假,天数:" +request.getLeaveDays()+"理由:"+request.getReason()); System.out.println("主任:"+this.name+"审核通过!"); } else { if(this.nextLeader!=null) { this.nextLeader.handleReauest(request); } } } } package com.match.chainOfResp; /** * 具体处理者(ConcreteHandler)角色--经理 * @author Match * */ public class Manager extends Leader { public Manager(String name) { super(name); } @Override public void handleReauest(LeaveRequest request) { if(request.getLeaveDays()<10) { System.out.println("员工:"+request.getEmpName()+"请假,天数:" +request.getLeaveDays()+"理由:"+request.getReason()); System.out.println("经理:"+this.name+"审核通过!"); } else { if(this.nextLeader!=null) { this.nextLeader.handleReauest(request); } } } } package com.match.chainOfResp; /** * 具体处理者(ConcreteHandler)角色--总经理 * @author Match * */ public class GeneralManager extends Leader { public GeneralManager(String name) { super(name); } @Override public void handleReauest(LeaveRequest request) { if(request.getLeaveDays()<30) { System.out.println("员工:"+request.getEmpName()+"请假,天数:" +request.getLeaveDays()+"理由:"+request.getReason()); System.out.println("总经理:"+this.name+"审核通过!"); } else { System.out.println("莫非员工:"+request.getEmpName()+"想辞职,居然请假" +request.getLeaveDays()+"天!"); } } }
客户端
package com.match.chainOfResp; public class Client { public static void main(String[] args) { Leader a = new Director("张三"); Leader b = new Manager("李四"); Leader c = new GeneralManager("王五"); //组织责任链对象的关系 a.setNextLeader(b); b.setNextLeader(c); //开始请假操作 LeaveRequest req = new LeaveRequest("Tom",20,"回家探亲!"); a.handleReauest(req); } }
测试输出
员工:Tom请假,天数:20理由:回家探亲! 总经理:王五审核通过!
相关文章推荐
- java设计模式——责任链模式(Chain of Responsibility Pattern)
- 4.11 《硬啃设计模式》 第28章 邮件自动处理系统?- 责任链模式(Chain of Responsibility Pattern)
- [重构到模式-Chain of Responsibility Pattern]把哈利波特购书优惠招式重构到责任链模式
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- [重构到模式-Chain of Responsibility Pattern]把Fizz Buzz招式重构到责任链模式
- 设计模式 - Chain of Responsibility Pattern(责任链模式)
- 设计模式【责任链模式Chain of Responsibility Pattern】
- 责任链模式(Chain Of Responsibility Pattern,对象行为模式)
- 第 17 章 责任链模式【Chain of Responsibility Pattern】
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 责任链模式(Chain of responsibility pattern)
- 设计模式 - Chain of Responsibility Pattern(责任链模式)
- 设计模式6--责任链模式(The chain of responsibility pattern)
- 责任链模式(Chain Of Responsibility Pattern)
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 设计模式学习—责任链模式(Chain of Responsibility Design Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- 责任链模式 - Chain of Responsibility Pattern
- 责任链模式(Chain Of Responsibility Pattern)