设计模式入门之职责链模式Chain Of Responsibility

//职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
//实例:申请费用的功能,不同金额的费用须要由不同的上级部分审核通过,假设下级没有审核的权限那么就让上级来进行审核
//上代码
//定义职责对象的接口
public abstract class Handler {
	protected Handler successor = null;
	public Handler(Handler successor) {
		this.successor = successor;
	}
	public abstract String handleFeeRequest(String user, double fee);
}
//详细的处理类,项目经理,等级较低
public class ProjectManager extends Handler {
	public String handleFeeRequest(String user, double fee) {
		String str = "";
		if(fee < 500) {
			if("小李".equals(user)) {//假设仅仅允许小李的申请
				str = "项目经理允许"+user+"聚餐费用"+fee+"元的请求";
			}else {
				str = "项目经理不允许"+user+"聚餐费用"+fee+"元的请求";
			}
		}else {
			if(this.successor != null) {
				return successor.handleFeeRequest(user, fee);
			}
		}
	}
}
//部门经理
public class DepManager extends Handler {
	public String handleFeeRequest(String user, double fee) {
		String str = "";
		if(fee < 1000) {
			if("小李".equals(user)) {//假设仅仅允许小李的申请
				str = "部门经理允许"+user+"聚餐费用"+fee+"元的请求";
			}else {
				str = "部门经理不允许"+user+"聚餐费用"+fee+"元的请求";
			}
		}else {
			if(this.successor != null) {
				return successor.handleFeeRequest(user, fee);
			}
		}
	}
}
//总经理
public class GeneralManager extends Handler {
	public String handleFeeRequest(String user, double fee) {
		String str = "";
		if(fee >= 10000) {
			if("小李".equals(user)) {//假设仅仅允许小李的申请
				str = "总经理允许"+user+"聚餐费用"+fee+"元的请求";
			}else {
				str = "总经理不允许"+user+"聚餐费用"+fee+"元的请求";
			}
		}else {
			if(this.successor != null) {
				return successor.handleFeeRequest(user, fee);
			}
		}
	}
}
//client測试
public class Client {
	public static void main(String[] args) {
		Handler h1 = new ProjectManager();
		Handler h2 = new DepManager();
		Handler h3 = new GeneralManager();

		h1.setSuccessor(h2);//设置职责链
		h2.setSuccessor(h3);

		String ret1 = h1.handleRequest("小李", 300);
		System.out.println("the ret1="+ret1);
		String ret2 = h1.handleRequest("小张", 300);
		System.out.println("the ret2="+ret2);

		String ret3 = h1.handleRequest("小李", 300);
		System.out.println("the ret3="+ret3);
		String ret4 = h1.handleRequest("小张", 300);
		System.out.println("the ret4="+ret4);

		String ret5 = h1.handleRequest("小李", 300);
		System.out.println("the ret5="+ret5);
		String ret6 = h1.handleRequest("小张", 300);
		System.out.println("the ret6="+ret6);
	}
}
//职责链模式的本质:分离职责,动态组合
//长处:请求者和接受者松散耦合,请求者不须要知道接受者是谁
//长处:动态组合职责
//缺点:产生非常多细粒度对象。不一定能被处理。这时就须要提供默认的处理
//职责链模式在找到接受者后就会处理完成,然后结束
//假设找到接受者后进行处理再交给下一个对象处理,那么就成为功能链了,也就是装饰器模式了
//何时选择职责链模式:
//1.假设有多个对象能够处理同一请求,可是详细由哪个对象来处理该请求,是执行时刻动态确定的。
//2.假设想在不指明接受者的情况下,向多个对象中的当中一个提交请求。
//3.假设想要动态指定处理一个请求的对象集合。

职责链模式能够动态构建职责链,也就是动态地来决定究竟哪些职责对象来參与到处理请求中来,相当于是动态地指定了处理一个请求的职责对象集合。
时间: 2024-10-11 07:07:05

设计模式入门之职责链模式Chain Of Responsibility的相关文章

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就推卸给另外个一个部门(对象).至于究竟谁来解决问题呢?政府部门就是为了能够避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,而且沿着这条链传递请求.直到有(部门)对象处理它为止. 样例1:js的事件浮升机制 样例2: 2.问题 假设有多个对象都有

设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题 如果有多个对象都有可能接受请求,如何避免避免请求发送者与接收者耦合在一起呢? 3.解决方案 职责链模式(Ch

atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3. 调用代码 2 4. 责任链链的特性: 2 5. 模式结构 4 6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4 7. 设置哈一个handler,,两个法:排序法,指定法 5 1. 指定法 5 2. 排

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 责任链模式中,每个对象通过持有对下家的引用而链接起来,形成一条链条,串联起来多个处理对象. 在责任链模式中,请求在链上进行传递,直到链上的某一个对象决定处理此请求. 发出这个请求的客户端程序并不知道到底是哪一个对象具体的处理了请求 这使得系统可以在不影响客户

职责链模式(Chain of Responsibility)

详解 定义 为了避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,职责链模式又称为责任链模式,它是一种对象行为型模式.(如果你接触过异常处理,那么套用异常处理机制可以更好地理解). 职责链可以是一条直线,也可以是一个环,还可以是一个树形结构,不过最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

职责链模式(Chain of Responsibility)(对象行为型)

职责链模式(Chain of Responsibility)(对象行为型) :使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.(Avoid coupling the sender of a request to itsreceiver by giving morethan one objecta chance to handle the request.Chain the receiving obje

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

重温设计模式(三)——职责链模式(chain of responsibility)

一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1. 链是一系列节点的集合. 2. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条