职责链模式

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

posted @ 2010-07-14 19:06  音乐啤酒  阅读(196)  评论(0编辑  收藏  举报