与状态模式相似的设计模式---职责链模式

今天我们要讨论的设计模式与前面提到的状态模式非常相似,他们不能的地方:状态模式是每个具体的状态处理自己状态的事务,若非自己状态处理的数据则将状态移动到一下一个具体状态类处理;而职责链则是根据自己的职责完成本职工作,若不能完成则判断是否已经关联了下一个环节职责,若存在则调用下一环节的处理。他们两个一个是在具体类中已经设定了下一环节,而另外一个则是在客户端先设定好职责链。

什么是职责链模式?使多个对象(职责对象)都有机会处理请求,从而避免了请求发送者与接收者之间的耦合性。将这职责对象连成一条链,使得传入的参数(指发送者的数据)并沿着链传递请求,直到有一个对象处理它为止。咱们在使用这种模式的时候一定要充分考虑好,否则会出现发出去的请求而没有一个职责对象处理。

抽象类(Handler)定义了如何设定职责链下一环节对象,抽象处理方法:

abstract class Handler

{

protected Handler handler;

//此方法的目的是设定后续的职责对象

public void SetSuccessor(Handler handler)

{

this.handler=handler;

}

//处理请求的抽象方法:后续继承类中具体实现处理,如处理不了则转到后续职责handler对象处理

public abstract void HandlerRequest(int Request);

}

具体的职责类就简单了,只需重写自己的处理方式,如果处理不了则转到下一个职责链对象处理(已经设定的handler对象):

class ConcreteHandler1:Handler
 {
	public override void HandlerRequest(int Request)
	{
		if(Request>0 && Request<=10)
		{
			Console.WriteLine("处理本职工作1");
		}
		else
		{
		    //已经设定后续的职责对象,并移交处理
			if(handler!=null)
			{
				handler.HandlerRequest(Request);
			}
		}
	}
 }

 class ConcreteHandler2:Handler
 {
	public override void HandlerRequest(int Request)
	{
		if(Request>10 && Request<=20)
		{
			Console.WriteLine("处理本职工作2");
		}
		else
		{
		    //已经设定后续的职责对象,并移交处理
			if(handler!=null)
			{
				handler.HandlerRequest(Request);
			}
		}
	}
 }
 class ConcreteHandler3:Handler
 {
	public override void HandlerRequest(int Request)
	{
		if(Request>20 && Request<=30)
		{
			Console.WriteLine("处理本职工作3");
		}
		else
		{
		    //已经设定后续的职责对象,并移交处理
			if(handler!=null)
			{
				handler.HandlerRequest(Request);
			}
		}
	}
 }

客户端代码,首先我们需要创建个职责链对象,并把所有的职责链对象串起来;每个处理请求的时候都从第一个职责对象开始就OK了:

//客户端代码
 static void Main(string[] arg)
 {
	Handler h1=new ConcreteHandler1();
	Handler h2=new ConcreteHandler2();
	Handler h3=new ConcreteHandler3();
	h1.SetSuccessor(h2);
	h2.SetSuccessor(h3);
	int[] request={2,8,12,16,23,29,30};
	foreach(int tmp in reguest)
	{
		h1.HandlerRequest(tmp);
	}
 }
 

这个设计模式的好处:减少我们各职责之间的耦合性,仅需设定处理不了时下一职责对象就好了。如果我们还需要进行添加职责,只需在重新继承基类重写一个具体职责类;易操作、不修改原来已写好的代码,实现了开放--闭合的设计原则。

时间: 2024-10-10 02:19:14

与状态模式相似的设计模式---职责链模式的相关文章

17. 星际争霸之php设计模式--职责链模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248202.html============================================

JAVA 设计模式 职责链模式

用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 职责链模式是一种行为型模式. 结构 图-职责链模式 Handler : 定义一个处理请求的接口.(可选的)实现设置后继者的方法. abstract class Handler {    protected Handler successor;    public void SetSu

javascript设计模式——职责链模式

前面的话 职责链模式的定义是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,把这些对象称为链中的节点.本文将详细介绍职责链模式 电商订单 职责链模式的例子在现实中并不难找到,以下就是两个常见的跟职责链模式有关的场景 如果早高峰能顺利挤上公交车的话,那么估计这一天都会过得很开心.

(20):(行为型模式) Chain Of Responsibility 职责链模式

(20):(行为型模式) Chain Of Responsibility 职责链模式,布布扣,bubuko.com

设计模式——职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. *在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收:在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收. 适用性 在以下条件下使用Responsibility 链: 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可动态指定一组对象处理

小菜学设计模式——职责链模式

背景 时间过得真快,转眼又是半年,可是作为一名将要资深的码农,是不是应该加薪了呢?可是说到加薪,经理又要推诿,这个不是我能决定的,你去找总监吧,总监又会说,在等等吧,等这个项目上线不会亏待你的.我的个神呀,这个产品上线估计要到明年春天吧!好吧,关于职责问题,这里就是一个著名的设计模式,职责链模式. 1.使用意图 把用户的请求,层层传递处理,直到这个请求被处理为止. 2.生活实例 工作加薪.请假. 3.Java 例子(框架.JDK .JEE) 暂时没有发现,如果有发现的同学可以提出修改. 4.模式

深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦.这就是职责链模式的模式动机. 模式定义职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个

PHP设计模式——职责链模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法. UML类图: 角色: 抽象处理者(Manager):定义出一个处理请求的接口.如果需要,接口可以定义出一个方法,以设定和返回对下家的引用.这个角色通常由一个抽象类或接口实现. 具体处理者(CommonManager):具体处理者接到请求后,可以

设计模式-职责链模式

1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止.    相信大家都写过if...else或者switch,当条件很多时需要写上数十行代码.如果要修改某些条件或者处理过程,就又要不断地修改这个牛叉的分支语句.这时我们可以采用职责链模式,它是将许多请求的分支或者步骤都独立出来.然后每个独立出来的部分,如果你是最终的处理那么就直接处理并结束,如果不是,那么就连接下一个处理步骤.这样就形成一个处理请求的链