Java设计模式之责任链设计模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
请求传递方向:从低级到高级
重点:如何形成这个责任链
特点:发出处理请求的客户端并不知道是系统当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。
1. 派生类中都具备的功能
(1) 都要设置后继者(一样)
(2) 都能实现自己职责范围内的功能(审批功能,具体审批细节不一样)
(3) 都具备把自己不能处理的请求传递给上级部门的功能(一样)
2.不同的功能
具体的处理情况不一样
3.例子以及代码实现
题目:已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5 万元至10 万元(不包括10 万元)的采购单,董事长可以审批10 万元至50 万元(不包括50 万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(Chain of Responsibility)。
3.1、请求类PurchaseRequest,采购请求的。
package com.designmode.chainofresponsibility;
public class PurchaseRequest {
private double amount; // 一个采购的金额
private int number; // 采购单编号
private String purpose; // 采购目的
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getPurpose() {
return purpose;
}
public void setPurpose(String purpose) {
this.purpose = purpose;
}
}
PurchaseRequest
3.2、审批者的共同父类Approver
package com.designmode.chainofresponsibility;
public class Approver {
private Approver successor; // 上级
/**
* 采购单审批
*/
public void processRequest(PurchaseRequest request){
if (successor!=null) {
successor.processRequest(request);
}
}
/**
* 设置上级
* @param successor
*/
public void setSuccessor(Approver successor){
this.successor=successor;
}
}
Approver
3.3、主任审批子类Director
package com.designmode.chainofresponsibility; /**
* 主任审批
*/
public class Director extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()<50000){
System.out.println("主任审批了");
}else {
super.processRequest(request);
}
}
}
Director
3.4、副董事长审批子类VicePresident
package com.designmode.chainofresponsibility; /**
* 副董事长审批
*/
public class VicePresident extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()>=50000&&request.getAmount()<100000){
System.out.println("副董事长审批审批了");
}else {
super.processRequest(request);
}
}
}
VicePresident
3.5、董事长审批子类President
package com.designmode.chainofresponsibility; /**
* 董事长审批
*/
public class President extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()>=100000&&request.getAmount()<500000){
System.out.println("董事长审批审批了");
}else {
super.processRequest(request);
}
}
}
President
3.6、例会审批子类Congress
package com.designmode.chainofresponsibility; /**
* 例会审批
*/
public class Congress extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()>=500000){
System.out.println("例会审批审批了");
}else {
super.processRequest(request);
}
}
}
Congress
3.7、测试类ApproverTest
package com.designmode.chainofresponsibility;
import java.util.Scanner;
public class ApproverTest {
@SuppressWarnings("resource")
public static void main(String[] args) {
Congress meeting = new Congress();
President president = new President();
VicePresident vicePresident = new VicePresident();
Director director = new Director();
// 构造责任链
director.setSuccessor(vicePresident);
vicePresident.setSuccessor(president);
president.setSuccessor(meeting);
Scanner reader = new Scanner(System.in);
PurchaseRequest request = new PurchaseRequest();
request.setAmount(reader.nextInt());
director.processRequest(request); // 开始审批
}
}
ApproverTest
Java设计模式之责任链设计模式的更多相关文章
- Java中的责任链设计模式,太牛了!
责任链设计模式的思想很简单,就是按照链的顺序执行一个个处理方法,链上的每一个任务都持有它后面那个任务的对象引用,以方便自己这段执行完成之后,调用其后面的处理逻辑. 下面是一个责任链设计模式的简单的实现 ...
- java filter过滤器及责任链设计模式
什么是Filter? Filter属于sevlet规范,翻译为过滤器. Filter在web开发中有什么作用? 案例一:一个web站点只有用户登录才能继续访问该站点的资源,那么需要用户每次访问都判断是 ...
- Jfinal----Handler之责任链设计模式
Jfinal handler的处理采用了责任链设计模式 有关责任链模式,推荐看: <JAVA与模式>之责任链模式 1.实现Handler只需要继承Handler public class ...
- JDK设计模式之——责任链(Filter)
责任链的设计模式可以参考Servlet的FilterChain.FilterChain中的每个Filter(过滤器)就像一个个的链条 web开发中 有时候需要对接口request和response进行 ...
- javascript实现责任链设计模式
javascript实现责任链设计模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理他为止. 这是Gof的定义 ...
- PHP责任链设计模式
<?php //责任链设计模式 /** * 每个对象,储存着对自己上级的引用, * 如果自己处理不了,交给上一级. */ class board{ protected $power=1; pro ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- C#设计模式:责任链模式
设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...
- 23种设计模式之责任链模式(Chain of Responsibility)
责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受, ...
随机推荐
- hashmap和hashtable,arraylist和vector的区别
hashmap线程不安全,hashtable线程安全 hashmap允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同. ...
- (二)iOS如何把所有界面的状态栏的字体颜色都设置为白色
第一步:在info.plist中添加一个字段:view controller -base status bar 设置为NO 第二步:在一个所有界面都继承的父类里添加: if (IOS7_OR_LATE ...
- poj2649 数论
//Accepted 420K 16MS //考虑 0和n! does not divide // 1和0! divides #include <cstdio> #include < ...
- sidePagination: "server"和responseHandler: responseHandler
bootstrapTable()中有两个属性 一个是sidePagination,表示服务器分页,responseHandler:responseHandler 表示回应操作的rows和total 两 ...
- hd oj2025
Ps:尼玛这道题简直坑爹...就是直接比较ascii码....无脑题,想复杂了... 代码:#include "stdio.h"#include "string.h&qu ...
- Intellij IDEA Help
https://www.jetbrains.com/idea/help/intellij-idea.html https://www.jetbrains.com/idea/help/creating- ...
- Interview----求 1+2+...+n, 不能用乘除法、for、while if、else、switch、case 等关键字以及条件判断语句 (A?B:C)
题目描述: 求 1+2+...+n, 要求不能使用乘除法.for.while.if.else.switch.case 等关键字以及条件判断语句 (A?B:C). 分析: 首先想到的是写递归函数,但是遇 ...
- MATLAB简单实现ID3
再看<MATLAB数据分析与挖掘实战>,简单总结下今天看到的经典的决策树算法——ID3. ID3:在决策树的各级节点上,使用信息增益的方法作为属性的选择标准,来帮助确定生成每个节点时所应采 ...
- 文件IO和标准IO
2015.2.26 星期四,阴天 今天的内容主要是文件IO man 手册的分册: man -f open 查看那些分册中有openman 1 -- 普通的命令程序man 2 -- 系统调用man 3 ...
- 3、网页制作Dreamweaver(表单form)
表单form (虚线不显示) 1.写法: <form id="form1" name="form1" method="post" ac ...