类关系图
![]()
类角色说明
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
意图
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
适用性
1、由多个对象可以处理一个请求,哪个对象处理该请求事先并不知道,而是在运行时候自动确定。
2、希望在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、处理一个请求的对象集合需要动态指定时。
泡妞的例子
晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的M M把纸条传给老师了,听说是个老处女呀,快跑!?
泡妞的代码
using System;
using System.Collections;
//
public class Request
{
private int lovepower;
public int LovePower
{
get{return lovepower;}
set{lovepower=value;}
}
public Request(int lovepower)
{
this.lovepower=lovepower;
}
}
public class MM
{
private string name;
private int LovePower;
private MM mm; //责任链模式的特点1:抽象处理角色中有一个对自己本身引用的对象,这个对象将要被赋值为责任链中的下一环的对象
public MM(string Name,int LovePower)
{
this.name=Name;
this.LovePower=LovePower;
}
//责任链模式特点2:为自身引用的赋值。将被赋值为责任链中的下一环的对象
public void SetNextMM(MM mm)
{
this.mm=mm;
}
public void DealRequest(Request request )
{
if(request.LovePower<this.LovePower) //责任链模式特点3:如果条件不成功,交由下一环处理(successor被赋值为下一环)
{
Console.WriteLine(this.name+":就这点诚意也想约老娘!");
if(mm!=null)
mm.DealRequest(request);
}
else
{
Console.WriteLine(this.name+":太好了,长这么大终于有人约我了!");
}
}
}
![]()
public class MyClass
{
public static void Main()
{
MM Lily=new MM("Lily",500);
MM Lucy=new MM("Lucy",600);
MM Ann=new MM("Ann",700);
MM Teacher=new MM("Teacher",100);
//责任链模式特点4:把自身中的引用对象赋值为下一环
Lily.SetNextMM(Lucy);
Lucy.SetNextMM(Ann);
Ann.SetNextMM(Teacher);
Request request=new Request(200);
Lily.DealRequest(request);
RL();
}
Helper methods
}

类角色说明
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
意图
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
适用性
1、由多个对象可以处理一个请求,哪个对象处理该请求事先并不知道,而是在运行时候自动确定。
2、希望在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、处理一个请求的对象集合需要动态指定时。
泡妞的例子
晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的M M把纸条传给老师了,听说是个老处女呀,快跑!?
泡妞的代码
using System;
using System.Collections;
//
public class Request
{
private int lovepower;
public int LovePower
{
get{return lovepower;}
set{lovepower=value;}
}
public Request(int lovepower)
{
this.lovepower=lovepower;
}
}
public class MM
{
private string name;
private int LovePower;
private MM mm; //责任链模式的特点1:抽象处理角色中有一个对自己本身引用的对象,这个对象将要被赋值为责任链中的下一环的对象
public MM(string Name,int LovePower)
{
this.name=Name;
this.LovePower=LovePower;
}
//责任链模式特点2:为自身引用的赋值。将被赋值为责任链中的下一环的对象
public void SetNextMM(MM mm)
{
this.mm=mm;
}
public void DealRequest(Request request )
{
if(request.LovePower<this.LovePower) //责任链模式特点3:如果条件不成功,交由下一环处理(successor被赋值为下一环)
{
Console.WriteLine(this.name+":就这点诚意也想约老娘!");
if(mm!=null)
mm.DealRequest(request);
}
else
{
Console.WriteLine(this.name+":太好了,长这么大终于有人约我了!");
}
}
}
public class MyClass
{
public static void Main()
{
MM Lily=new MM("Lily",500);
MM Lucy=new MM("Lucy",600);
MM Ann=new MM("Ann",700);
MM Teacher=new MM("Teacher",100);
//责任链模式特点4:把自身中的引用对象赋值为下一环
Lily.SetNextMM(Lucy);
Lucy.SetNextMM(Ann);
Ann.SetNextMM(Teacher);
Request request=new Request(200);
Lily.DealRequest(request);
RL();
}
Helper methods
}
责任链模式
在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不 被任何接收端对象所接受。
备注
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一个是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。纯的责任链模式的例子是不容易找到的,一般看到的例子均是不纯的责任链模式的实现。


浙公网安备 33010602011771号