模式实例之——职责链实例

  1. 云栖社区>
  2. 博客>
  3. 正文

模式实例之——职责链实例

zsj2018 2009-12-07 17:28:00 浏览251
展开阅读全文

场景:白眉大俠与江湖

 

描述:江湖绿林道与开封府。小喽兵与小寨主,小七杰可以办案。侠客要小五义。剑客要剑客对付。

 

(一)开封府

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

    {

        public override void Handle(LuLin lulin)

        {

            if (lulin.LulinType == eType.xiake)

            {

                Console.WriteLine("侠客,小五义可以处理了!");

            }

            else

            {

                if (_kaifeng != null)

                    _kaifeng.Handle(lulin);

            }

        }

    }

 

    public class JianKe : KaiFentFu

    {

        public override void Handle(LuLin lulin)

        {

            if (lulin.LulinType == eType.jianke)

            {

                Console.WriteLine("剑客,小五义的老师可以处理了!");

            }

            else

            {

                if (_kaifeng != null)

                    _kaifeng.Handle(lulin);

            }

        }

    }

(三)绿林

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/

转载请注明:博客园

网友评论

登录后评论
0/500
评论
zsj2018
+ 关注