zoukankan      html  css  js  c++  java
  • 职责链模式

         * 职责链模式:使多个对象都有机会处理请求,从而避免发送的请求者和处理者的耦合关系。将对象炼成一个条
         * 并延这个链处理请求,知道一个对象处理他为止
         *
         * 图例:
         *
         * 客户端不需要知道具体哪个处理类处理了这个请求,只要提交就可以,提交请求后请求就会延着职责链
         * 一直运行,直到碰到处理他的具体类为止
         *
         * 也简化了职责链上具体类的关系,各个具体来更关注自己的处理逻辑,只需要指定一个继任的具体类就可以
         * 而且可以随时随意的在职责链上添加或者删除新的具体处理类,更灵活
         *
         * 需要注意的事,一个请求可能到了职责链的末端也没有具体处理类,这可能是因为配置错误,或者业务逻辑错误
         * 本文的例子中request=d的条件就没有具体处理类,就会报错(没有指定对应的继任者)

    代码:

    /// <summary>
        /// 抽象处理类
        /// </summary>
        public abstract class Handler
        {
            protected Handler successor;//设置继任者

            public void SetHandler(Handler successor)//通过这个方法设置继任者,如果自己处理不了就会让继任者去处理
            {
                this.successor = successor;
            }

            public abstract void HandleRequest(string request);//处理请求的抽象方法
           
        }

        public class HandlerA : Handler
        {
            public override void HandleRequest(string  request)
            {
                if (request == "a")//如果请求是a,那么就自己处理
                {
                    Console.WriteLine("Handler A deal this ");
                }
                else//如果这个请求处理不了,就转交给继任者处理,继任者就是通过SetHandler来设置的
                {
                    successor.HandleRequest(request);
                }
            }
        }

        public class HandlerB : Handler
        {
            public override void HandleRequest(string request)
            {
                if (request == "b")
                {
                    Console.WriteLine("Handler B deal this");
                }
                else
                {
                    successor.HandleRequest(request);
                }
            }
        }

        public class HandlerC :Handler
        {
            public override void HandleRequest(string request)
            {
                if (request == "c")
                {
                    Console.WriteLine("Hanler C Deal this");
                }
                else
                {
                    successor.HandleRequest(request);
                }
            }
        }

    客户端调用和组织

                Handler ha = new HandlerA();
                Handler hb = new HandlerB();
                HandlerC hc = new HandlerC();

                ha.SetHandler(hb);//设置职责链的上家和下家
                hb.SetHandler(hc);//组织好职责链

                //ha类的继任者是hb,hb的继任者是hc,hc没有继任者,如果到了hc仍然有未处理的请求那就会报错

                string[] test ={ "a","b","c","d"};
                foreach(string request in test)
                {
                    ha.HandleRequest(request);
                }


     

    本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

  • 相关阅读:
    配置虚拟主机并更改Apache默认解析路径
    在ListView中实现排序
    petshop4.0 具体解释之中的一个(系统架构设计)
    学习笔记之TCP/IP协议分层与OSI參考模型
    cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
    cmake 学习笔记(一)
    标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
    Web.xml配置具体解释之context-param
    福克斯:悲观?乐观?就看你与世界怎么互动
    Android 服务类Service 的具体学习
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319292.html
Copyright © 2011-2022 走看看