GOF 23 设计模式之 责任链模式(Chain Of Responsibility)
来源:互联网 发布:网络许可 编辑:程序博客网 时间:2024/06/03 16:27
定义:
- 将能够处理同一类请求的对象连成一条链,所提交的请求验者链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
场景
- 打牌时,轮流出牌
- 接力赛跑
- 大学中,奖学金审批
- 公司里,公文审批
实现方式
- 链表方式定义职责链
- 非链表方式定义职责链
- 通过集合、数组生成职责链更加实用!实际上,很多项目中,每个具体的Handler并不是由开发团队定义的,而是项目上线后由外部单位追加的,所以使用链表方式定义COR链就很困难
开发中常见的场景
- Java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch
- Javascript语言中,事件的冒泡和捕获机制。Java语言中,事件的处理采用观察者模式
- Servlet开发中,过滤器的链式处理
- Struts2中,拦截器的调用也是经典的责任链模式
代码实现
- LeaveRequest
package com.coderbean.chainOfResp;/** * 请假的基本信息 * Created by Chang on 15/10/3. */public class LeaveRequest { private String name; private int leaveDays; private String reason; public LeaveRequest(String name, int leaveDays, String reason) { this.name = name; this.leaveDays = leaveDays; this.reason = reason; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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; }}
- Leader
package com.coderbean.chainOfResp;/** * Created by Chang on 15/10/3. */public abstract class Leader { protected String name; protected Leader nextLeader; //责任链伤的后继对象 public Leader(String name) { this.name = name; } public void setNextLeader(Leader nextLeader) { this.nextLeader = nextLeader; } public abstract void handleRequest(LeaveRequest request);}
- Director
package com.coderbean.chainOfResp;/** * Created by Chang on 15/10/3. */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.getName()+"请假"+request.getLeaveDays()+"天"); System.out.println("主任:审批通过"); }else{ if(this.nextLeader!=null){ this.nextLeader.handleRequest(request); } } }}
- Manager
package com.coderbean.chainOfResp;/** * Created by Chang on 15/10/3. */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.getName()+"请假"+request.getLeaveDays()+"天"); System.out.println("经理:审批通过"); }else{ if(this.nextLeader!=null){ this.nextLeader.handleRequest(request); } } }}
- GeneralManager
package com.coderbean.chainOfResp;/** * Created by Chang on 15/10/3. */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.getName()+"请假"+request.getLeaveDays()+"天"); System.out.println("总经理:审批通过"); }else{ System.out.println("莫非"+request.getName()+"想辞职,居然请假"+request.getLeaveDays()+"天"); } }}
- Client
package com.coderbean.chainOfResp;/** * Created by Chang on 15/10/3. */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 request = new LeaveRequest("TOM",100,"会英国老家探亲"); a.handleRequest(request); }}
0 0
- GOF 23 设计模式之 责任链模式(Chain Of Responsibility)
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式之责任链模式(Chain of Responsibility)
- 设计模式之责任链(Chain of Responsibility)
- 设计模式之-责任链(Chain of responsibility )
- 【行为型模式】责任链模式(chain of responsibility)之23种java设计模式
- 设计模式之责任链Chain of Responsibility模式
- 设计模式之责任链模式(Chain of Responsibility)
- 设计模式之责任链模式--- Pattern chain-of-responsibility
- 设计模式之13 - 责任链模式Chain Of Responsibility
- 设计模式拾荒之责任链模式 ( Chain of Responsibility)
- GOF设计模式之CHAIN OF RESPONSIBILITY(职责链)
- 23种设计模式之责任链模式(Chain of Responsibility)
- Java开发中的23种设计模式之十七:责任链模式(Chain of Responsibility)
- 浅谈设计模式:责任链模式(Chain Of Responsibility)
- Java设计模式----责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- USACO 2.4 The Tamworth Two
- iOS之UI随笔-字典转模型以及双模型的构建
- HDU 5468 Puzzled Elena(容斥原理+dfs)
- linux 内存操作
- hdoj 3468 Treasure Hunting 【BFS找所有最短路径上的点 + 最大流】
- GOF 23 设计模式之 责任链模式(Chain Of Responsibility)
- Count Complete Tree Nodes
- POJ 1276 Cash Machine (多重背包)
- nginx的accept互斥锁
- ACM学习-动态规划-子问题编码
- 打开新的页面.HTML
- uva10810(求逆序数)
- 对于JVM的浅解
- ZOJ-3897-Fiddlesticks