定义:使多个对象都有机会处理请求。从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链。并沿着这条链传递该请求,直到有一个对象处理它为止。

优点:当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明白信息,且链中的对象自己也并不知道链的结构。

结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它全部的候选接收者的引用。这就大大减少了耦合度了。因为式在client来定义链的结构,也就是说。我能够随时得添加或改动处理一个请求的结构。

增强了给对象指派职责的灵活性。

 

基本代码:

using System;

using System.Collections.Generic;

using System.Text;

namespace 职责链模式

{

    class Program

    {

        static void Main(string[] args)

        {

            Handler h1 = new ConcreteHandler1();

            Handler h2 = new ConcreteHandler2();

            Handler h3 = new ConcreteHandler3();

            h1.SetSuccessor(h2);

            h2.SetSuccessor(h3);

            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

            foreach (int request in requests)

            {

                h1.HandleRequest(request);

            }

            Console.Read();

        }

    }

    abstract class Handler

    {

        protected Handler successor;

        public void SetSuccessor(Handler successor)

        {

            this.successor = successor;

        }

        public abstract void HandleRequest(int request);

    }

    class ConcreteHandler1 : Handler

    {

        public override void HandleRequest(int request)

        {

            if (request >= 0 && request < 10)

            {

                Console.WriteLine("{0}  处理请求  {1}",

                  this.GetType().Name, request);

            }

            else if (successor != null)

            {

                successor.HandleRequest(request);

            }

        }

    }

    class ConcreteHandler2 : Handler

    {

        public override void HandleRequest(int request)

        {

            if (request >= 10 && request < 20)

            {

                Console.WriteLine("{0}  处理请求  {1}",

                  this.GetType().Name, request);

            }

            else if (successor != null)

            {

                successor.HandleRequest(request);

            }

        }

    }

    class ConcreteHandler3 : Handler

    {

        public override void HandleRequest(int request)

        {

            if (request >= 20 && request < 30)

            {

                Console.WriteLine("{0}  处理请求  {1}",

                  this.GetType().Name, request);

            }

            else if (successor != null)

            {

                successor.HandleRequest(request);

            }

        }

    }

}

样例:

using System;

using System.Collections.Generic;

using System.Text;

namespace 职责链模式

{

    class Program

    {

        static void Main(string[] args)

        {

            CommonManager jinli = new CommonManager("金利");

            Majordomo zongjian = new Majordomo("宗剑");

            GeneralManager zhongjingli = new GeneralManager("钟精励");

            jinli.SetSuperior(zongjian);

            zongjian.SetSuperior(zhongjingli);

            Request request = new Request();

            request.RequestType = "请假";

            request.RequestContent = "小菜请假";

            request.Number = 1;

            jinli.RequestApplications(request);

            Request request2 = new Request();

            request2.RequestType = "请假";

            request2.RequestContent = "小菜请假";

            request2.Number = 4;

            jinli.RequestApplications(request2);

            Request request3 = new Request();

            request3.RequestType = "加薪";

            request3.RequestContent = "小菜请求加薪";

            request3.Number = 500;

            jinli.RequestApplications(request3);

            Request request4 = new Request();

            request4.RequestType = "加薪";

            request4.RequestContent = "小菜请求加薪";

            request4.Number = 1000;

            jinli.RequestApplications(request4);

            Console.Read();

        }

    }

    //管理者

    abstract class Manager

    {

        protected string name;

        //管理者的上级

        protected Manager superior;

        public Manager(string name)

        {

            this.name = name;

        }

        //设置管理者的上级

        public void SetSuperior(Manager superior)

        {

            this.superior = superior;

        }

        //申请请求

        abstract public void RequestApplications(Request request);

    }

    //经理

    class CommonManager : Manager

    {

        public CommonManager(string name)

            : base(name)

        { }

        public override void RequestApplications(Request request)

        {

            if (request.RequestType == "请假" && request.Number <= 2)

            {

                Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);

            }

            else

            {

                if (superior != null)

                    superior.RequestApplications(request);

            }

        }

    }

    //总监

    class Majordomo : Manager

    {

        public Majordomo(string name)

            : base(name)

        { }

        public override void RequestApplications(Request request)

        {

            if (request.RequestType == "请假" && request.Number <= 5)

            {

                Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);

            }

            else

            {

                if (superior != null)

                    superior.RequestApplications(request);

            }

        }

    }

    //总经理

    class GeneralManager : Manager

    {

        public GeneralManager(string name)

            : base(name)

        { }

        public override void RequestApplications(Request request)

        {

            if (request.RequestType == "请假")

            {

                Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);

            }

            else if (request.RequestType == "加薪" && request.Number <= 500)

            {

                Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);

            }

            else if (request.RequestType == "加薪" && request.Number > 500)

            {

                Console.WriteLine("{0}:{1} 数量{2} 再说吧", name, request.RequestContent, request.Number);

            }

        }

    }

    //申请

    class Request

    {

        //申请类别

        private string requestType;

        public string RequestType

        {

            get { return requestType; }

            set { requestType = value; }

        }

        //申请内容

        private string requestContent;

        public string RequestContent

        {

            get { return requestContent; }

            set { requestContent = value; }

        }

        //数量

        private int number;

        public int Number

        {

            get { return number; }

            set { number = value; }

        }

    }

}