• 职责链模式分析、结构图与基本代码


    

    定义:使多个对象都有机会处理请求。从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链。并沿着这条链传递该请求,直到有一个对象处理它为止。
    优点:当客户提交一个请求时,请求时沿链传递直至有一个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; }
            }
        }


    }

  • 相关阅读:
    51Nod——T 1242 斐波那契数列的第N项
    51Nod——T 1113 矩阵快速幂
    第二课 eclipse安装
    第一课 JDK环境变量配置
    浅谈hibernate的sessionFactory和session
    hibernate配置文件
    eclipse的new server里tomcat7.0根本选不上解决方法
    CATALINA_BASE与CATALINA_HOME的区别
    Tomcat的overview界面浅析
    Win10系统 Eclipse 下'Publishing to Tomcat'has encountered a problem解决办法
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6786416.html
Copyright © 2020-2023  润新知