设计模式学习笔记---职责链模式chain of responsibility(Java版)
2015-03-04 15:51
791 查看
创建型模式:关注对象的创建工程。
结构型模式:关注对象和类的组织。
行为型模式:关注系统中对象的相互交互研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。
一、场景
打牌时,轮流出牌
接力赛跑
公文审批
二、实质
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能,则处理。如果不能,则传递给链上的下一个对象。
三、示例(请假条的审批)
请假条审批过程:
小于3天--主任审批
3-10天-- 经理审批
10-30天--总经理审批
大于30天--提示拒绝
四、两种方式
链表方式实现责任链(如上示例所示)
非链表方式实现责任链
通过集合、数组生成职责链更加实用。实际上,很多项目中,每个具体的Handle并不是由开发团队定义的,而是项目上线后由外部单位追加的,所以使用链表方式定义COR链就很困难。
五、开发场景
Java异常机制 一个try对应多个catch,当一个catch不匹配类型,则自动跳到第二个catch中。
JavaScript中,事件的冒泡和捕获机制。
Servlet中,过滤器的链式处理。
Struct2中,拦截器的调用也是责任链。
结构型模式:关注对象和类的组织。
行为型模式:关注系统中对象的相互交互研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。
一、场景
打牌时,轮流出牌
接力赛跑
公文审批
二、实质
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能,则处理。如果不能,则传递给链上的下一个对象。
三、示例(请假条的审批)
请假条审批过程:
小于3天--主任审批
3-10天-- 经理审批
10-30天--总经理审批
大于30天--提示拒绝
package com.lgd.chainofresponsibility; /** * 请假的基本信息 * @author liguodong * */ 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; } }
package com.lgd.chainofresponsibility; /** * 抽象类 * @author liguodong * */ 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; } /*********************/ //处理请求的核心业务方法 public abstract void handleRequest(LeaveRequest request); }
package com.lgd.chainofresponsibility; public class Director extends Leader{ public Director(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void handleRequest(LeaveRequest request) { // TODO Auto-generated method stub 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); } } } }
package com.lgd.chainofresponsibility; public class Manager extends Leader{ public Manager(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void handleRequest(LeaveRequest request) { // TODO Auto-generated method stub 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); } } } }
package com.lgd.chainofresponsibility; public class GeneralManager extends Leader{ public GeneralManager(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void handleRequest(LeaveRequest request) { // TODO Auto-generated method stub 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.lgd.chainofresponsibility; public class Client { public static void main(String[] args) { Leader aLeader = new Director("张山"); Leader bLeader = new Manager("李斯"); Leader cLeader = new GeneralManager("王五"); //组织责任链对象的关系 aLeader.setNextLeader(bLeader); bLeader.setNextLeader(cLeader); //开始请假操作 LeaveRequest req1 = new LeaveRequest("Tom", 10, "回火星"); aLeader.handleRequest(req1); } }
四、两种方式
链表方式实现责任链(如上示例所示)
非链表方式实现责任链
通过集合、数组生成职责链更加实用。实际上,很多项目中,每个具体的Handle并不是由开发团队定义的,而是项目上线后由外部单位追加的,所以使用链表方式定义COR链就很困难。
五、开发场景
Java异常机制 一个try对应多个catch,当一个catch不匹配类型,则自动跳到第二个catch中。
JavaScript中,事件的冒泡和捕获机制。
Servlet中,过滤器的链式处理。
Struct2中,拦截器的调用也是责任链。
相关文章推荐
- 设计模式学习笔记之-职责链模式CHAIN OF RESPONSIBILITY
- java 设计模式学习笔记十六 chain of responsibility 职责链设计模式
- 设计模式学习笔记——Chain of Responsibility职责链模式
- 设计模式学习笔记--Chain Of Responsibility 职责链模式
- java 设计模式学习笔记十六 chain of responsibility 职责链设计模式
- 设计模式学习笔记(十五)——Chain Of Responsibility职责链
- 【设计模式学习笔记十四】【行为模式】【职责链模式(Chain Of Responsibility)】
- 设计模式学习笔记(十九)—Chain of Responsibility职责链模式
- 设计模式学习之路——Chain Of Responsibility 职责链模式
- 【Java设计模式】· 职责链模式(Chain of Responsibility)
- [设计模式学习笔记]CHAIN OF RESPONSIBILITY(职责链)
- java学习笔记-设计模式18(职责链模式)
- JAVA设计模式学习第三天 设计模式之Chain of Responsibility——项目篇
- Java设计模式-----Chain of Responsibility职责链模式
- Java设计模式十一: 职责链模式(Chain of Responsibility)
- 设计模式学习笔记十四——Chain of Responsibility模式
- 设计模式深入学习--Chain of Responsibility 职责链模式职责链模式(行为型模式)
- Java设计模式-----Chain of Responsibility职责链模式
- 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
- Java设计模式——职责链模式(Chain of Responsibility)