设计模式的应用场景(17)--职责链模式
来源:互联网 发布:mac裁剪图片 编辑:程序博客网 时间:2024/06/07 20:55
职责链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求直到有一个处理它为止。
优点:降低类之间的耦合度,使得处理类仅需要保持一个指向后继者的引用,也使得一个对象无需知道是其他哪一个对象处理其请求,对象仅需知道该请求会被正确处理。接收者和发送者都没有明确的对方信息,增强了给对象指派职责的灵活性。
缺点:因为对象不知道是其它哪一个对象处理其请求的,所以职责链模式不保证对象被接收。
使用时机:当有多个对象处理请求,而且需要动态指定处理者的时候,可以使用职责链模式。
例子:
某公司的内部财务支出需要网上审批,对于不同额度的需要不同级别的人审批。这个可以用职责链模式实现。
首先设计一个抽象类,代表审批的人
public abstract class Approver { public abstract void approve(BorrowBill borrowBill); public Approver getSuccessor(){ return successor; } public void setSuccessor(Approver successor){ this.successor = successor; } private Approver successor;}
后面实现具体的各级别审批者,涉及金额不一样
public class DepartApprover extends Approver { public void approve(BorrowBill borrowBill) { if (borrowBill.getAmt() < 5000d) { System.out.println("该员工部门主管审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getAmt()); } else if (super.getSuccessor() != null) { super.getSuccessor().approve(borrowBill); } }}public class FinanceApprover extends Approver { public void approve(BorrowBill borrowBill) { if (borrowBill.getAmt() >= 5000d && borrowBill.getAmt() < 10000d) { System.out.println("财务部门主管审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getAmt()); } else if (super.getSuccessor() != null) { super.getSuccessor().approve(borrowBill); } }}public class VicepresidentApprover extends Approver { public void approve(BorrowBill borrowBill) { if (borrowBill.getAmt() >= 10000d && borrowBill.getAmt() < 20000d) { System.out.println("财务副总审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getAmt()); } else if (super.getSuccessor() != null) { super.getSuccessor().approve(borrowBill); } }}public class ManagerApprover extends Approver { public void approve(BorrowBill borrowBill) { if (borrowBill.getAmt() >= 20000d && borrowBill.getAmt() < 50000d) { System.out.println("公司总经理审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getAmt()); } else if (super.getSuccessor() != null) { super.getSuccessor().approve(borrowBill); } }}public class ChairmanApprover extends Approver { public void approve(BorrowBill borrowBill) { if (borrowBill.getAmt() >= 50000d) { System.out.println("公司董事长审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getAmt()); } else if (super.getSuccessor() != null) { System.out.println("公司董事长没有上级了"); } }}
最后客户端把审批者都加进来,形成职责链
public class Client { public static void main(String[] argv) { Approver departApprover = new DepartApprover(); Approver financeApprover = new FinanceApprover(); Approver vicepresidentApprover = new VicepresidentApprover(); Approver managerApprover = new ManagerApprover(); Approver chairmanApprover = new ChairmanApprover(); departApprover.setSuccessor(financeApprover); financeApprover.setSuccessor(vicepresidentApprover); vicepresidentApprover.setSuccessor(managerApprover); managerApprover.setSuccessor(chairmanApprover); BorrowBill borrowBill = new BorrowBill(); borrowBill.setName("出差借支单"); borrowBill.setAmt(3000d); departApprover.approve(borrowBill); borrowBill.setName("出差借支单"); borrowBill.setAmt(6000d); departApprover.approve(borrowBill); borrowBill.setName("采购办公用品借支单"); borrowBill.setAmt(15000d); departApprover.approve(borrowBill); borrowBill.setName("采购原料借支单"); borrowBill.setAmt(45000d); departApprover.approve(borrowBill); borrowBill.setName("采购原料借支单"); borrowBill.setAmt(100000d); departApprover.approve(borrowBill); }}
阅读全文
0 0
- 设计模式的应用场景(17)--职责链模式
- 职责链模式的应用
- 项目设计之---------- 职责链模式应用
- 设计模式应用场景
- 设计模式应用场景
- 设计模式应用场景
- 设计模式 应用场景
- 设计模式 应用场景
- 设计模式应用场景
- 设计模式应用场景
- 设计模式 应用场景
- 设计模式应用场景
- 职责链设计模式
- 【设计模式】职责链
- 设计模式---职责链
- 职责链设计模式
- 职责链设计模式
- 设计模式---职责链模式
- LINUX之系统分区及挂载的概念
- Spark学习笔记(12)源码解读之Executor容错安全性
- Java —— 多线程笔记 一、线程创建、启动、生命周期、线程控制
- 2017 java程序员面试宝典
- HDU 1671 Phone List(字典树Trie)
- 设计模式的应用场景(17)--职责链模式
- CentOS 7下源码安装MySQL 5.7
- Nginx下ThinkPHP5的配置方法详解
- 服务器架构
- Hbase原理与架构
- 如何在maven工程中加载oracle驱动
- 我们的四连
- Spark学习笔记(13)源码解读之Driver容错安全性
- HTML5基础