责任链模式(chain of responsibility)
来源:互联网 发布:软件测试需要学什么 编辑:程序博客网 时间:2024/05/01 20:32
责任链模式定义:将能够处理同一类请求的对象连成一条链,所提及的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
责任链属于行为型模式的一种。行为型模式关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。
下面使用公司请假的例子来说明:
1.创建请假请求者
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; } }
2.创建Leader抽象类与不同级别的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);}
3.接下来是不同级别的领导,分别负责不同的请假请求:
主任:
/** * 主任 * @author Administrator * */public class Director extends Leader { public Director(String name) { super(name); } @Override public 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); } } }}
经理:
/** * 经理 * @author Administrator * */public class Manager extends Leader { public Manager(String name) { super(name); } @Override public 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); } } }}
总经理:
/** * 总经理 * @author Administrator * */public class GeneralManager extends Leader { public GeneralManager(String name) { super(name); } @Override public 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()+"天!"); } }}
4.客户端测试:
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); }}
责任链模式在开发中的应用场景:
1.Java中异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch;
2.javaScript中事件的冒泡和捕获机制;
3.Servlet开发中过滤器的链式处理;
4.Struts2中拦截器的调用;
0 0
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链(chain of responsibility)模式
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(chain of responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 行为型模式-----责任链模式(chain of responsibility)
- 浅谈设计模式:责任链模式(Chain Of Responsibility)
- Java设计模式----责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- Java责任链模式(Chain of Responsibility模式)
- APNS消息推送
- 算法整理——通过树的遍历顺序重建树
- 致所有仍然关注BreezeMaphack的朋友
- win7下建立vpn连接后不能上外网的解决办法
- 封装php的非对称加密RSA
- 责任链模式(chain of responsibility)
- Java&为什么泛型不能放int
- VTK 读取JPEG图像 灰度化 彩色映射
- iOS学习之——如何隐藏UINavigationBar
- Hive的内置服务和hiveserver/hiveserver2的比较
- TCP与UDP的区别
- service
- HDU 5761 Rower Bo 物理题(积分求时间)
- 您需要安装旧 Java SE 6 运行环境才能打开“eclipse”解决