zoukankan      html  css  js  c++  java
  • 模式实例之——职责链实例

    场景:白眉大俠与江湖

     

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

     

    (一)开封府

    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/

    转载请注明:博客园

  • 相关阅读:
    HTML5进阶段内联标签汇总(小篇)
    Html5元素及基本语法
    HTML5中判断横屏竖屏
    用H5+Boostrap做简单的音乐播放器
    html5学习笔记(3)--主题结构元素-1
    css3制作旋转立方体相册
    css3的媒体查询(Media Queries)
    认识和理解css布局中的BFC
    getattr、setattr、hasattr
    Python-有名匿名函数、列表推导式
  • 原文地址:https://www.cnblogs.com/jams742003/p/1618791.html
Copyright © 2011-2022 走看看