问题引人:申请聚餐费用,申请人填写申请单,然后交给领导审阅,如果申请批准下来,领导会通知申请人,然后申请人去财务领费用,如果没有就罢了。项目经理、部门经理、总经理审批的费用额度不同。一般申请人并不知道到底是由谁来处理他的请求。
项目经理-》部门经理->总经理,也可能是部门经理->总经理,责任链是变化的。
不使用设计模式的解决方式:
package notusingMode;
public class FeeRequest {
//提交申请给部门经理
public String requestToProjectManager(String user,double fee){
String str = "";
if(fee<500){
str = this.projectHandle(user,fee);
}
else if(fee<1000){
str = this.deptManagerHandle(user,fee);
}
else if(fee>=1000){
str = this.generalManagerHandle(user,fee);
}
return str;
}
private String generalManagerHandle(String user, double fee) {
String str = "";
if("小李".equals(user)){
str="总经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str ="总经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
private String deptManagerHandle(String user, double fee) {
String str = "";
if("小李".equals(user)){
str="部门经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str ="部门经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
private String projectHandle(String user, double fee) {
String str = "";
if("小李".equals(user)){
str="项目经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str ="项目经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
}
package notusingMode;
public class Client {
public static void main(String[] args) {
FeeRequest request = new FeeRequest();
String ret1 = request.requestToProjectManager("小李", 300);
}
}
问题抽象:客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的。对于客户端而言,无所谓谁来处理。还希望处理流程是可以灵活
变动的,而处理请求的对象需要能方便地修改或者被替换掉,以适应新的业务功能的需要。如何?=---》责任链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一个链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构:
Handler:定义职责的接口,通常在这里定义处理请求的方法,可以在这里实现后继链
ConcreteHandler:实现职责的类,在这个类中,实现对在它职责范围内请求的处理,如果不处理就转发请求给后继者。
Client:职责链的客户端,向链上的具体处理对象提交请求,让责任链负责处理。
package chainOfResponsibility;
public abstract class Handler {
protected Handler successor; // 后继者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest();
}
package chainOfResponsibility;
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest() {
boolean someCondition = false;
if(someCondition){
//如果属于自己职责范围,就在这里处理请求
System.out.println("ConcreteHandler1 handle request");
}
else{//不属于自己职责范围,就转发给后继的职责对象
if(this.successor!=null){
this.successor.handleRequest();
}
}
}
}
package chainOfResponsibility;
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest() {
boolean someCondition = false;
if(someCondition){
//如果属于自己职责范围,就在这里处理请求
System.out.println("ConcreteHandler2 handle request");
}
else{//不属于自己职责范围,就转发给后继的职责对象
if(this.successor!=null){
this.successor.handleRequest();
}
}
}
}
package chainOfResponsibility;
public class Client {
public static void main(String[] args) {
// 先组装责任链
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
h1.setSuccessor(h2);
//然后提交请求
h1.handleRequest();
}
}
package chainOfResponsibilitySolve;
public abstract class Handler {
protected Handler successor; // 后继者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract String handleFeeRequest(String user,double fee);
}
使用责任链设计模式解决上述的费用请求问题:
package chainOfResponsibilitySolve;
public class ProjectManager extends Handler {
String str = "";
@Override
public String handleFeeRequest(String user, double fee) {
if(fee<500){
if("小李".equals(user)){
str="项目经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str="项目经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
else{
//超过500,继续传递给级别更高的人来处理
if(this.successor!=null){
return successor.handleFeeRequest(user, fee);
}
}
return str;
}
}
package chainOfResponsibilitySolve;
public class DeptManager extends Handler {
String str = "";
@Override
public String handleFeeRequest(String user, double fee) {
if(fee<1000){
if("小李".equals(user)){
str="部门经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str="部门经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
else{
//超过500,继续传递给级别更高的人来处理
if(this.successor!=null){
return successor.handleFeeRequest(user, fee);
}
}
return str;
}
}
package chainOfResponsibilitySolve;
public class GeneralManager extends Handler {
String str = "";
@Override
public String handleFeeRequest(String user, double fee) {
if(fee>=1000){
if("小李".equals(user)){
str="总经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str="总经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
else{
//超过500,继续传递给级别更高的人来处理
if(this.successor!=null){
return successor.handleFeeRequest(user, fee);
}
}
return str;
}
}
package chainOfResponsibilitySolve;
public class Client {
public static void main(String[] args) {
// 先组装责任链
Handler h1 = new ProjectManager();
Handler h2 = new DeptManager();
Handler h3 = new GeneralManager();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
//然后提交请求
h1.handleFeeRequest("张三",300);
}
}
处理多个请求的应用如包multipleRequest,但是有一个问题是,只要增加一个业务,就需要修改职责的接口,这是很不灵活的,java开发中很强调面向接口编程,因此接口应该相对保持稳定。
modifyMultipleRequest
功能链,如过滤器,在业务逻辑处理之前,进行权限检查,通用数据校验,数据逻辑校验等处理如销售信息保存的应用如sales
分享到:
相关推荐
责任链模式是一种行为设计模式,它允许我们定义一系列对象,这些对象可以按顺序处理请求,每个对象都可以处理请求的一部分或全部,并将未处理的请求传递给链中的下一个对象。这种模式使得请求的发送者无需知道哪个...
**C#设计模式之Chain of Responsibility(责任链)** 责任链模式是一种行为设计模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象能够处理这个请求。在C#中,责任链模式可以用来解耦发送者和接收...
"Chain of Responsibility"(责任链)模式是其中一种行为设计模式,它允许我们把请求沿着处理者对象的链式结构进行传递,直到某个对象能够处理这个请求。这种模式的主要优点在于它解耦了发送请求的对象和处理请求的...
9. ChainofResponsibility模式,责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 10. Iterator模式,迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露...
欢迎此存储库中的ChainOfResponsibility.java文件说明了如何实现“责任链设计模式”。 该程序是使用NetBeans 8.0创建的,可以在上找到。 要使用该程序,只需运行该程序并通过控制台输出查看结果。
13. **ChainOfResponsibility模式**:责任链模式避免硬编码一个接收者和发送者的连接。请求沿着链传递,直到某个对象处理它。 14. **Command模式**:命令模式将请求封装为一个对象,以便使用不同的请求、队列请求、...
"责任链"(Chain of Responsibility)模式是一种行为设计模式,它允许我们定义一系列对象,每个对象都可以处理一个请求,或者将请求传递给链中的下一个对象。这个模式的核心思想是通过将处理请求的对象串联成一条链...
5.1ChainofResponsibility(责任链模式) 168 5.1.1定义 168 5.1.2现实中的实例——军情的传递 169 5.1.3C#实例——采购分级审批 170 5.1.4Java实例——智能大厦安全系统 174 5.1.5优势和缺陷 178 5.1.6应用...
**责任链模式**(Chain of Responsibility):避免将处理请求的发送者和接收者耦合在一起,让多个对象都有可能处理这个请求,将这些对象连接成一条链,在沿着这条链传递请求,直到有一个对象处理它,如...
pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 pattern/src/behavior/memento //13.7备忘录模式 pattern/src/behavior/state //13.8状态模式 ...
行为型简介职责链模式(ChainofResponsibility)命令模式(Command)解释器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)备忘录模式(Memento)观察者模式(Observer)状态模式(State)策略模式(Strategy)模板...
`ChainofResponsibility.h`可能定义了处理者接口和多个具体处理者类,它们构成了责任链。 8. **状态模式(State)**:状态模式允许对象在其内部状态改变时改变其行为。`State.h`可能包含了状态接口和多个具体状态类,...
行为型模式包括十一中设计模式:模板方法模式(TemplateMethod)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、职责链模式(ChainofResponsibility)、命令模式(Command)、访问者模式...
责任链设计模式 前言 对于已经工作了的小伙伴,你八成是见过"责任链"这种面向对象的设计模式的,还在上学的小伙伴也不用着急,你迟早会接触到的。本文旨在让小白同学和 不太熟悉责任链的朋友能够Swift对这一设计模式...
Java 中的设计模式在 Java 中... 迭代器观察员[模板方法] (TemplateMethod/) 【责任链】(ChainOfResponsibility/) [状态](状态/) 【调解员】(调解员/) [纪念品] (纪念品/) [空对象] (NullObject/) [访客] (访客/)
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
Chain of Responsibility(责任链)模式是一种行为设计模式,它允许将请求沿着处理者对象的链进行发送,每个对象都可以处理请求或将其传递给链中的下一个对象。这种模式常用于事件处理或者命令的执行流程,使得多个...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...