责任链模式

来源:互联网 发布: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);}}


原创粉丝点击