责任链模式
来源:互联网 发布:2017最新癌症数据统计 编辑:程序博客网 时间:2024/06/11 05:43
定义:将能够处理同一类请求的对象连成一条链,所提交的请求沿链传递,能处理的自己处理,不能处理的传递给下一个对象。
场景:java中异常机制try{}catch{};js中时间的冒泡和捕获机制,java语言中事件采取观察者模式;servlet开发中,过滤器的链处理;struct2拦截器的调用也是典型的责任链模式
例子:比如请假流程,就是一层一层的传递给下一个领导,就是链状结构。
Leader(抽象类)
public abstract class Leader {protected String name;protected Leader nextLeader; //责任链上的后继对象public Leader(String name) {super();this.name = name;}//设定责任链上的后继对象public void setNextLeader(Leader nextLeader) {this.nextLeader = nextLeader;}/** * 处理请求的核心的业务方法 * @param request */public abstract void handleRequest(LeaveRequest request);}
Director.java(主任)
public class Director extends Leader {public Director(String name) {super(name);}@Overridepublic void handleRequest(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.handleRequest(request);}}}}
Manager.java(经理)
public class Manager extends Leader {public Manager(String name) {super(name);}@Overridepublic void handleRequest(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.handleRequest(request);}}}}
ViceGeneralMannager.java(副总经理)
public class ViceGeneralManager extends Leader {public ViceGeneralManager(String name) {super(name);}@Overridepublic void handleRequest(LeaveRequest request) {if(request.getLeaveDays()<20){System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());System.out.println("副总经理:"+this.name+",审批通过!");}else{if(this.nextLeader!=null){this.nextLeader.handleRequest(request);}}}}
GeneraManager.java(总经理)
public class GeneralManager extends Leader {public GeneralManager(String name) {super(name);}@Overridepublic void handleRequest(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()+"天!");}}}
LeaveRequest.java(请假消息)
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;} }
测试
public class Client {public static void main(String[] args) {Leader a = new Director("张三");Leader b = new Manager("李四");Leader b2 = new ViceGeneralManager("李小四");Leader c = new GeneralManager("王五");//组织责任链对象的关系a.setNextLeader(b);b.setNextLeader(b2);b2.setNextLeader(c);//开始请假操作LeaveRequest req1 = new LeaveRequest("TOM", 15, "回英国老家探亲!");a.handleRequest(req1);}}
阅读全文
0 0
- 责任链模式
- 深入浅出责任链模式
- 责任链模式
- 责任链模式
- 深入浅出责任链模式
- 责任链模式(一)
- 责任链模式(二)
- 责任链模式(三)
- 责任链模式
- java责任链模式
- 责任链模式
- 责任链模式
- 责任链模式
- 责任链模式
- 责任链模式
- c++ 责任链模式
- java责任链模式
- 责任链模式
- js中typeof的用法
- VCCLCompilerTool 属性 -VS2013版
- 利用iframe进行父页面和子页面的通信
- eclipse/Myeclipse自动适配jar包源码
- IntelliJ IDEA 使用心得与常用快捷键
- 责任链模式
- eclipse for php调试环境配置
- 关键帧的使用方法
- C# 泛型 WHERE 约束
- 给页面上的Date类型的item赋初始值
- MFC——中文输入
- leetcode 605. Can Place Flowers
- interview experience
- 关于Keil MDK 中 use microlib 设置项解析