(1)应用:
应用责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
(2)角色
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
(3)故事
话说悟空向东海龙王强夺了定海神针,却又来索要披挂
悟空道:“当时若无此铁,倒也罢了,如今手中既拿着他,身上更无衣服相趁,奈何?你这里若有披挂,索性送我一副,一总奉谢。”龙王道:“这个却是没有。”悟空道:“一客不犯二主,若没有,我也定不出此门。”龙王道:“烦上仙再转一海,或者有之。”悟空又道:“走三家不如坐一家,千万告求一副。”龙王道:“委的没有,如有即当奉承。”悟空道:“真个没有,就和你试试此铁!”龙王慌了道:“上仙,切莫动手,切莫动手!待我看舍弟处可有,当送一副。”
.......
少时,钟鼓响处,果然惊动那三海龙王。须臾来到,一齐在外面会着。敖钦道:“大哥,有甚紧事,擂鼓撞钟?”老龙道:“贤弟,不好说!有一个花果山什么天生圣人,早间来认我做邻居,后要求一件兵器,献钢叉嫌小,奉画戟嫌轻,将一块天河定底神珍铁,自己拿出手,丢了些解数。如今坐在宫中,又要索什么披挂。我处无有,故响钟鸣鼓,请贤弟来。你们可有什么披挂,送他一副,打发出门去罢了。”敖钦闻言,大怒道:“我兄弟们点起兵,拿他不是!”老龙道:“莫说拿,莫说拿!那块铁,挽着些儿就死,磕着些儿就亡,挨挨儿皮破,擦擦儿筋伤!”西海龙王敖闰说:“二哥不可与他动手,且只凑副披挂与他,打发他出了门,启表奏上上天,天自诛也。”北海龙王敖顺道:“说的是。我这里有一双藕丝步云履哩。”西海龙王敖闰道:“我带了一副锁子黄金甲哩。”南海龙王敖钦道:“我有一顶凤翅紫金冠哩。”老龙大喜,引入水晶宫相见了,以此奉上。悟空将金冠、金甲、云履都穿戴停当,使动如意棒,一路打出去,对众龙道:“聒噪,聒噪!”四海龙王甚是不平,一边商议进表上奏不题。斋
(4)分析
1.东海龙王敖广 有权给定海神针
2.北海龙王敖顺 有权给藕丝步云履
3.西海龙王敖闰 有权给锁子黄金甲
4.南海龙王敖钦 有权给凤翅紫金冠
有趣的是美猴王却不找其它三家,认定了"走三家不如坐一家",只找敖广一个人
(5)实现
using System;
public enum 武器枚举{定海神针,藕丝步云履,锁子黄金甲,凤翅紫金冠,我还要};
public abstract class 负责人 {
protected string 姓名;
protected 武器枚举 武器;
protected 负责人 下一个负责人;
public 负责人(string 姓名,武器枚举 武器){
this.武器=武器;
this.姓名=姓名;
}
public void 设置下一个负责人(负责人 下一个负责人) {
this.下一个负责人 = 下一个负责人;
}
public abstract void 处理请求(美猴王 孙悟空,武器枚举 武器);
}
public class 龙王 : 负责人 {
public 龙王(string 姓名, 武器枚举 武器):base(姓名,武器){}
public override void 处理请求(美猴王 孙悟空, 武器枚举 武器)
{
if (this.武器 == 武器)
{
Console.WriteLine(姓名+"说:我有,我给");
孙悟空.接收(武器);
}
else {
if (下一个负责人 != null) {
Console.WriteLine(姓名 + "说:我没有,转给下一个人处理");
下一个负责人.处理请求(孙悟空,武器);
}
else {
Console.WriteLine(姓名 + "我们都没有了,找玉帝去要吧");
}
}
}
}
public class 责任链 {
public 负责人 责任链入口;
public 责任链()
{
负责人 东海龙王敖广 = new 龙王("东海龙王敖广", 武器枚举.定海神针);
负责人 北海龙王敖顺 = new 龙王("北海龙王敖顺", 武器枚举.凤翅紫金冠);
负责人 西海龙王敖闰 = new 龙王("西海龙王敖闰", 武器枚举.藕丝步云履);
负责人 南海龙王敖钦 = new 龙王("南海龙王敖钦", 武器枚举.锁子黄金甲);
东海龙王敖广.设置下一个负责人(北海龙王敖顺);
北海龙王敖顺.设置下一个负责人(西海龙王敖闰);
西海龙王敖闰.设置下一个负责人(南海龙王敖钦);
责任链入口 = 东海龙王敖广;
}
}
public class 美猴王 {
public void 索要(责任链 四海龙王,武器枚举 武器) {
Console.WriteLine("美猴王说:/t我要"+武器.ToString());
四海龙王.责任链入口.处理请求(this, 武器);
}
public void 接收(武器枚举 武器) {
Console.WriteLine("美猴王说:/t我收到" + 武器.ToString());
}
}
public class 大闹水晶宫 {
public static void Main(){
责任链 四海龙王 = new 责任链();
美猴王 孙悟空 = new 美猴王();
孙悟空.索要(四海龙王, 武器枚举.定海神针);
孙悟空.索要(四海龙王, 武器枚举.凤翅紫金冠);
孙悟空.索要(四海龙王, 武器枚举.藕丝步云履);
孙悟空.索要(四海龙王, 武器枚举.锁子黄金甲);
孙悟空.索要(四海龙王, 武器枚举.我还要);
Console.Read();
}
}
(6)结果
美猴王说: 我要定海神针
东海龙王敖广说:我有,我给
美猴王说: 我收到定海神针
美猴王说: 我要凤翅紫金冠
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我有,我给
美猴王说: 我收到凤翅紫金冠
美猴王说: 我要藕丝步云履
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我有,我给
美猴王说: 我收到藕丝步云履
美猴王说: 我要锁子黄金甲
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我没有,转给下一个人处理
南海龙王敖钦说:我有,我给
美猴王说: 我收到锁子黄金甲
美猴王说: 我要我还要
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我没有,转给下一个人处理
南海龙王敖钦我们都没有了,找玉帝去要吧
应用责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
(2)角色
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
(3)故事
话说悟空向东海龙王强夺了定海神针,却又来索要披挂
悟空道:“当时若无此铁,倒也罢了,如今手中既拿着他,身上更无衣服相趁,奈何?你这里若有披挂,索性送我一副,一总奉谢。”龙王道:“这个却是没有。”悟空道:“一客不犯二主,若没有,我也定不出此门。”龙王道:“烦上仙再转一海,或者有之。”悟空又道:“走三家不如坐一家,千万告求一副。”龙王道:“委的没有,如有即当奉承。”悟空道:“真个没有,就和你试试此铁!”龙王慌了道:“上仙,切莫动手,切莫动手!待我看舍弟处可有,当送一副。”
.......
少时,钟鼓响处,果然惊动那三海龙王。须臾来到,一齐在外面会着。敖钦道:“大哥,有甚紧事,擂鼓撞钟?”老龙道:“贤弟,不好说!有一个花果山什么天生圣人,早间来认我做邻居,后要求一件兵器,献钢叉嫌小,奉画戟嫌轻,将一块天河定底神珍铁,自己拿出手,丢了些解数。如今坐在宫中,又要索什么披挂。我处无有,故响钟鸣鼓,请贤弟来。你们可有什么披挂,送他一副,打发出门去罢了。”敖钦闻言,大怒道:“我兄弟们点起兵,拿他不是!”老龙道:“莫说拿,莫说拿!那块铁,挽着些儿就死,磕着些儿就亡,挨挨儿皮破,擦擦儿筋伤!”西海龙王敖闰说:“二哥不可与他动手,且只凑副披挂与他,打发他出了门,启表奏上上天,天自诛也。”北海龙王敖顺道:“说的是。我这里有一双藕丝步云履哩。”西海龙王敖闰道:“我带了一副锁子黄金甲哩。”南海龙王敖钦道:“我有一顶凤翅紫金冠哩。”老龙大喜,引入水晶宫相见了,以此奉上。悟空将金冠、金甲、云履都穿戴停当,使动如意棒,一路打出去,对众龙道:“聒噪,聒噪!”四海龙王甚是不平,一边商议进表上奏不题。斋
(4)分析
1.东海龙王敖广 有权给定海神针
2.北海龙王敖顺 有权给藕丝步云履
3.西海龙王敖闰 有权给锁子黄金甲
4.南海龙王敖钦 有权给凤翅紫金冠
有趣的是美猴王却不找其它三家,认定了"走三家不如坐一家",只找敖广一个人
(5)实现
using System;
public enum 武器枚举{定海神针,藕丝步云履,锁子黄金甲,凤翅紫金冠,我还要};
public abstract class 负责人 {
protected string 姓名;
protected 武器枚举 武器;
protected 负责人 下一个负责人;
public 负责人(string 姓名,武器枚举 武器){
this.武器=武器;
this.姓名=姓名;
}
public void 设置下一个负责人(负责人 下一个负责人) {
this.下一个负责人 = 下一个负责人;
}
public abstract void 处理请求(美猴王 孙悟空,武器枚举 武器);
}
public class 龙王 : 负责人 {
public 龙王(string 姓名, 武器枚举 武器):base(姓名,武器){}
public override void 处理请求(美猴王 孙悟空, 武器枚举 武器)
{
if (this.武器 == 武器)
{
Console.WriteLine(姓名+"说:我有,我给");
孙悟空.接收(武器);
}
else {
if (下一个负责人 != null) {
Console.WriteLine(姓名 + "说:我没有,转给下一个人处理");
下一个负责人.处理请求(孙悟空,武器);
}
else {
Console.WriteLine(姓名 + "我们都没有了,找玉帝去要吧");
}
}
}
}
public class 责任链 {
public 负责人 责任链入口;
public 责任链()
{
负责人 东海龙王敖广 = new 龙王("东海龙王敖广", 武器枚举.定海神针);
负责人 北海龙王敖顺 = new 龙王("北海龙王敖顺", 武器枚举.凤翅紫金冠);
负责人 西海龙王敖闰 = new 龙王("西海龙王敖闰", 武器枚举.藕丝步云履);
负责人 南海龙王敖钦 = new 龙王("南海龙王敖钦", 武器枚举.锁子黄金甲);
东海龙王敖广.设置下一个负责人(北海龙王敖顺);
北海龙王敖顺.设置下一个负责人(西海龙王敖闰);
西海龙王敖闰.设置下一个负责人(南海龙王敖钦);
责任链入口 = 东海龙王敖广;
}
}
public class 美猴王 {
public void 索要(责任链 四海龙王,武器枚举 武器) {
Console.WriteLine("美猴王说:/t我要"+武器.ToString());
四海龙王.责任链入口.处理请求(this, 武器);
}
public void 接收(武器枚举 武器) {
Console.WriteLine("美猴王说:/t我收到" + 武器.ToString());
}
}
public class 大闹水晶宫 {
public static void Main(){
责任链 四海龙王 = new 责任链();
美猴王 孙悟空 = new 美猴王();
孙悟空.索要(四海龙王, 武器枚举.定海神针);
孙悟空.索要(四海龙王, 武器枚举.凤翅紫金冠);
孙悟空.索要(四海龙王, 武器枚举.藕丝步云履);
孙悟空.索要(四海龙王, 武器枚举.锁子黄金甲);
孙悟空.索要(四海龙王, 武器枚举.我还要);
Console.Read();
}
}
(6)结果
美猴王说: 我要定海神针
东海龙王敖广说:我有,我给
美猴王说: 我收到定海神针
美猴王说: 我要凤翅紫金冠
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我有,我给
美猴王说: 我收到凤翅紫金冠
美猴王说: 我要藕丝步云履
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我有,我给
美猴王说: 我收到藕丝步云履
美猴王说: 我要锁子黄金甲
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我没有,转给下一个人处理
南海龙王敖钦说:我有,我给
美猴王说: 我收到锁子黄金甲
美猴王说: 我要我还要
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我没有,转给下一个人处理
南海龙王敖钦我们都没有了,找玉帝去要吧