• 《大话设计模式》学习笔记20:职责链模式


      

      

    申请审批示例:

      

    1.请求类:

        public class Request
        {
            public string RequestType { get; set; }
            public string RequestContent { get; set; }
            public int Number { get; set; }
        }

    2.Handler:

        public abstract class Manager
        {
            protected string name;
            protected Manager superiorManager;
    
            public Manager(string name)
            {
                this.name = name;
            }
            public void SetSuperior(Manager superiorManager)
            {
                this.superiorManager = superiorManager;
            }
            public abstract void RequestApplication(Request request);
        }

    3.ConcreteHandler:

        public class CommonManager:Manager
        {
            public CommonManager(string name)
                :base(name)
            {
    
            }
            public override void RequestApplication(Request request)
            {
                if(request.RequestType=="请假"&&request.Number<=2)
                {
                    Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestType, request.Number);
                }
                else
                {
                    if(superiorManager!=null)
                    {
                        superiorManager.RequestApplication(request);
                    }
                }
            }
        }
        public class Majordomo:Manager
        {
            public Majordomo(string name)
                :base(name)
            {
    
            }
            public override void RequestApplication(Request request)
            {
                if(request.RequestType=="请假"&&request.Number<=5)
                {
                    Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestType, request.Number);
                }
                else
                {
                    if(superiorManager!=null)
                    {
                        superiorManager.RequestApplication(request);
                    }
                }
            }
        }
        public class GeneralManager:Manager
        {
            public GeneralManager(string name)
                :base(name)
            {
    
            }
            public override void RequestApplication(Request request)
            {
                if(request.RequestType=="请假")
                {
                    Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestType, request.Number);
                }
                else if(request.RequestType=="加薪")
                {
                    if (request.Number <= 500)
                    {
                        Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestType, request.Number);
                    }
                    else
                    {
                        Console.WriteLine("{0}:{1} 数量{2} 再说吧", name, request.RequestType, request.Number);
                    }
                }
            }
        }

    客户端代码:

        class Program
        {
            static void Main(string[] args)
            {
                Manager commonManager = new CommonManager("经理");
                Manager majordom = new Majordomo("总监");
                Manager generalManager = new GeneralManager("总经理");
    
                commonManager.SetSuperior(majordom);
                majordom.SetSuperior(generalManager);
    
                Request request = new Request();
    
                request.RequestType = "请假"; request.RequestContent = "事假"; request.Number = 1;
                commonManager.RequestApplication(request);
    
                request.RequestType = "请假"; request.RequestContent = "年假"; request.Number = 4;
                commonManager.RequestApplication(request);
    
                request.RequestType = "加薪"; request.RequestContent = "加薪一千"; request.Number = 1000;
                commonManager.RequestApplication(request);
            }
        }

      优点:接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有候选接受者的引用。

  • 相关阅读:
    js 数据类型的转换
    js数组学习方法汇总
    跳转页面的方法总结
    今天用js做拉一个时钟
    今天用js做拉一个时钟
    js中字符的比较
    1005 继续(3n+1)猜想 (25分)
    1002 写出这个数
    日期差值
    1040 有几个PAT (25分)
  • 原文地址:https://www.cnblogs.com/walden1024/p/4528972.html
Copyright © 2020-2023  润新知