场景:白眉大俠与江湖
描述:江湖绿林道与开封府。小喽兵与小寨主,小七杰可以办案。侠客要小五义。剑客要剑客对付。
(一)开封府
public abstract class KaiFentFu
{
protected KaiFentFu _kaifeng;
public void SetHandler(KaiFentFu kaifeng)
{
_kaifeng = kaifeng;
}
public abstract void Handle(LuLin lulin);
}
(二)小七杰,小五义,小五义老师
public class XiaoQiJie : KaiFentFu
public override void Handle(LuLin lulin)
if (lulin.LulinType == eType.loubing || lulin.LulinType == eType.zhaizhu)
{
Console.WriteLine("小小喽兵和小寨主,小七杰可以处理了!");
}
else
{
if (_kaifeng != null)
_kaifeng.Handle(lulin);
public class XiaoWuYi : KaiFentFu
if (lulin.LulinType == eType.xiake)
Console.WriteLine("侠客,小五义可以处理了!");
public class JianKe : KaiFentFu
if (lulin.LulinType == eType.jianke)
{
Console.WriteLine("剑客,小五义的老师可以处理了!");
(三)绿林
public enum eType
{
loubing=0,
zhaizhu,
xiake,
jianke
public class LuLin
public string Name { get; set; }
public eType LulinType { get; set; }
(四)测试
public void TestChainOfResponsibility()
{
//小七杰,小五义,小五义老师
KaiFentFu _k1 = new XiaoQiJie();
KaiFentFu _k2 = new XiaoWuYi();
KaiFentFu _k3 = new JianKe();
_k1.SetHandler(_k2);
_k2.SetHandler(_k3);
List<LuLin> _list = new List<LuLin>();
_list.Add(new LuLin { LulinType = eType.jianke, Name = "剑客1" });
_list.Add(new LuLin { LulinType=eType.loubing,Name="小喽兵1"});
_list.Add(new LuLin { LulinType = eType.xiake, Name = "侠客1" });
_list.Add(new LuLin { LulinType = eType.zhaizhu, Name = "小寨主1" });
_list.Add(new LuLin { LulinType = eType.zhaizhu, Name = "小寨主2" });
_list.Add(new LuLin { LulinType = eType.jianke, Name = "剑客2" });
_list.Add(new LuLin { LulinType = eType.loubing, Name = "小喽兵21" });
foreach(LuLin ll in _list)
_k1.Handle(ll);
}
结果:
剑客,小五义的老师可以处理了!
小小喽兵和小寨主,小七杰可以处理了!
侠客,小五义可以处理了!
在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。
如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
这个例子里,这个链没有尽头(没有对全部可能的请求进行处理),它没有对尽可能的请求做出处理。但在链的结尾,应当把请求处理完毕。
博客园大道至简
http://www.cnblogs.com/jams742003/转载请注明:博客园