`

责任链设计模式chainOfResponsibility

阅读更多
问题引人:申请聚餐费用,申请人填写申请单,然后交给领导审阅,如果申请批准下来,领导会通知申请人,然后申请人去财务领费用,如果没有就罢了。项目经理、部门经理、总经理审批的费用额度不同。一般申请人并不知道到底是由谁来处理他的请求。
项目经理-》部门经理->总经理,也可能是部门经理->总经理,责任链是变化的。
不使用设计模式的解决方式:
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





















分享到:
评论
1 楼 xlsky0713 2011-12-08  
为什么不把 “申请就餐” 这个业务抽象出来
可以建一个业务接口类 如 abstract class apply
定义抽象方法 excute()

把handleFeeRequest 参数换为 apply

根据apply 类型 判断是handler 还是直接指向那个 excute 方法

这样业务变更后 我们只需要修改 实现类的 excute 方法就可以了

相关推荐

    设计模式专题之(十五)责任链模式---设计模式责任链模式示例代码(python--c++)

    责任链模式是一种行为设计模式,它允许我们定义一系列对象,这些对象可以按顺序处理请求,每个对象都可以处理请求的一部分或全部,并将未处理的请求传递给链中的下一个对象。这种模式使得请求的发送者无需知道哪个...

    C#设计模式之ChainofResponsibility

    **C#设计模式之Chain of Responsibility(责任链)** 责任链模式是一种行为设计模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象能够处理这个请求。在C#中,责任链模式可以用来解耦发送者和接收...

    23种设计模式的java实现-ChainOfResponsibility

    "Chain of Responsibility"(责任链)模式是其中一种行为设计模式,它允许我们把请求沿着处理者对象的链式结构进行传递,直到某个对象能够处理这个请求。这种模式的主要优点在于它解耦了发送请求的对象和处理请求的...

    设计模式C++版

    9. ChainofResponsibility模式,责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 10. Iterator模式,迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露...

    chainOfResponsibility_java:一个简单的程序来演示责任链设计模式

    欢迎此存储库中的ChainOfResponsibility.java文件说明了如何实现“责任链设计模式”。 该程序是使用NetBeans 8.0创建的,可以在上找到。 要使用该程序,只需运行该程序并通过控制台输出查看结果。

    C++常见设计模式的解析和实现

    13. **ChainOfResponsibility模式**:责任链模式避免硬编码一个接收者和发送者的连接。请求沿着链传递,直到某个对象处理它。 14. **Command模式**:命令模式将请求封装为一个对象,以便使用不同的请求、队列请求、...

    chainofresponsibility.zip

    "责任链"(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应用...

    as3.0设计模式代码实现汇总

    **责任链模式**(Chain of Responsibility):避免将处理请求的发送者和接收者耦合在一起,让多个对象都有可能处理这个请求,将这些对象连接成一条链,在沿着这条链传递请求,直到有一个对象处理它,如...

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 pattern/src/behavior/memento //13.7备忘录模式 pattern/src/behavior/state //13.8状态模式 ...

    设计模式之11个行为型模式

    行为型简介职责链模式(ChainofResponsibility)命令模式(Command)解释器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)备忘录模式(Memento)观察者模式(Observer)状态模式(State)策略模式(Strategy)模板...

    设计模式-行为模式

    `ChainofResponsibility.h`可能定义了处理者接口和多个具体处理者类,它们构成了责任链。 8. **状态模式(State)**:状态模式允许对象在其内部状态改变时改变其行为。`State.h`可能包含了状态接口和多个具体状态类,...

    设计模式简介

    行为型模式包括十一中设计模式:模板方法模式(TemplateMethod)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、职责链模式(ChainofResponsibility)、命令模式(Command)、访问者模式...

    java简易版开心农场源码-ChainOfResponsibility:责任链

    责任链设计模式 前言 对于已经工作了的小伙伴,你八成是见过"责任链"这种面向对象的设计模式的,还在上学的小伙伴也不用着急,你迟早会接触到的。本文旨在让小白同学和 不太熟悉责任链的朋友能够Swift对这一设计模式...

    Design-Patterns-in-Java:各种设计模式的Java实现

    Java 中的设计模式在 Java 中... 迭代器观察员[模板方法] (TemplateMethod/) 【责任链】(ChainOfResponsibility/) [状态](状态/) 【调解员】(调解员/) [纪念品] (纪念品/) [空对象] (NullObject/) [访客] (访客/)

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    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模式

    Chain of Responsibility(责任链)模式是一种行为设计模式,它允许将请求沿着处理者对象的链进行发送,每个对象都可以处理请求或将其传递给链中的下一个对象。这种模式常用于事件处理或者命令的执行流程,使得多个...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...

Global site tag (gtag.js) - Google Analytics