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)
责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受, ...
随机推荐
- stm32定义GPIO口方向和操作的代码
#include "stm32f10x.h" #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+(( ...
- Setup Factory 打包.netframework 2.0
在setup factory 的安装目录下的Dependencies中新建目录dotnet20/并放入dotnetfx2.0.exe: Dependencies目录中再加xml文件dotnet20.x ...
- MySQL的简单查询
1.普通查询 select * from info; #查询所有内容 select Code,Name from Info #查询某几列 2.条件查询 select * from Info where ...
- c++形参和实参同名时,如何单步执行观察形参的变化。
c++形参和实参同名时,如何单步执行观察形参的变化? 方法:当程序运行到函数中时,添加变量观察即可.
- 一个基于atomic的卖票测试
package testAtomic; import java.util.concurrent.atomic.AtomicInteger; import sun.security.krb5.inter ...
- R.java不能自动更新
1. The type R is already defined. (很多时候我们在导入其他人的程序的时候,会遇到这个错误) 通常在project里有两个R.java,一个在src,一个在gen,通常 ...
- hdoj-2033
A+B系列: #include "stdio.h"int main(){ int a[3],b[3],c[3],i,n,j,flag; while(~scanf("%d& ...
- swift系统学习第二章
第五节:可选类型 optional //: Playground - noun: a place where people can play import UIKit /* Swift学习第五节 可选 ...
- ios openURL的使用(调用系统电话、浏览器、地图、邮件等)
Safari Any URL starting with http:// which does not point to maps.google.com or www.youtube.com is s ...
- 用Qt图形视图框架开发拼图游戏
用Qt的图形视图框架(Graphics View Framework)做了一个拼图游戏DEMO,演示了: QGraphicsView.QGraphicsScene.QGraphicsItem的基本用法 ...