首页 > 其他分享 >责任链模式

责任链模式

时间:2023-06-06 16:25:18浏览次数:30  
标签:set get 模式 责任 Manager context public LeaveContext

一、定义

多个对象都有机会处理某个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

二、UML类图

 

  • Handler:抽象处理者角色,是一个处理请求的接口或抽象类;

  • ConcreteHandler:具体的处理者角色,具体的处理者接收到请求后可以选择将请求处理掉,或者将请求传递给下一个处理者。

  • ConcreteStrategy:具体的策略实现。

三、示例

用程序实现一个请假流程,根据请假天数不同,需要各级领导审批,例如,如果请假时长不超过1天,则直接团队负责人申请即可,超过1天不超过3天则需要项目经理审批通过才行,而超过3天不超过7天则需要CTO审批等等。

代码

 1.Manager.cs

 public abstract class Manager
    {
        public Manager NextManager { get; set; }

        public string Name { get; set; }

        public Manager(string name)
        {
            Name = name;
        }

        public void HandleRequest(LeaveContext context)
        {
            if (CanHandle(context))
            {
                Handle(context);
                return;
            }

            NextManager?.HandleRequest(context);
        }

        protected abstract bool CanHandle(LeaveContext context);

        protected abstract void Handle(LeaveContext context);
    }

2.TL.cs

    /// <summary>
    /// 团队领导者
    /// </summary>
    public class TL : Manager
    {
        public TL(string name): base(name)
        {
        }

        protected override bool CanHandle(LeaveContext context)
        {
            return context.Request.LeaveDays <= 1;
        }

        protected override void Handle(LeaveContext context)
        {
            context.Response = new LeaveResponse
            {
                Approver = "TL:" + Name,
                IsAgreed = true
            };
        }
    }

3.PM.cs

    /// <summary>
    /// 项目经理
    /// </summary>
    public class PM : Manager
    {
        public PM(string name): base(name)
        {
        }

        protected override bool CanHandle(LeaveContext context)
        {
            return context.Request.LeaveDays > 1
                && context.Request.LeaveDays <= 3;
        }

        protected override void Handle(LeaveContext context)
        {
            context.Response = new LeaveResponse
            {
                Approver = "PM:" + Name,
                IsAgreed = true
            };
        }
    }

4.HR.cs

 public class HR
    {
        private List<Manager> _managers = new List<Manager>();

        public void AddManager(Manager manager)
        {
            _managers.Add(manager);
        }

        public Manager GetManager()
        {
            Manager currentManager = null;
            for (int i = _managers.Count - 1; i >= 0; i--)
            {
                if (currentManager != null)
                {
                    _managers[i].NextManager = currentManager;
                }

                currentManager = _managers[i];
            }

            return currentManager;
        }
    }

5.LeaveContext.cs

    /// <summary>
    /// 请假单
    /// </summary>
    public class LeaveContext
    {
        /// <summary>
        /// 申请
        /// </summary>
        public LeaveRequest Request { get; set; }

        /// <summary>
        /// 审批结果
        /// </summary>
        public LeaveResponse Response { get; set; }
    }

6.LeaveRequest.cs

    /// <summary>
    /// 请假申请
    /// </summary>
    public class LeaveRequest
    {
        /// <summary>
        /// 申请人
        /// </summary>
        public string Applicant { get; set; }

        /// <summary>
        /// 请假天数
        /// </summary>
        public int LeaveDays { get; set; }

        /// <summary>
        /// 请假理由
        /// </summary>
        public string Reason { get; set; }
    }

7.LeaveResponse.cs

    /// <summary>
    /// 审批结果
    /// </summary>
    public class LeaveResponse
    {
        /// <summary>
        /// 审批人
        /// </summary>
        public string Approver { get; set; }

        /// <summary>
        /// 是否同意
        /// </summary>
        public bool IsAgreed { get; set; }
    }

8.Program.cs

internal class Program
    {
        static void Main(string[] args)
        {
            LeaveContext context = new LeaveContext
            {
                Request = new LeaveRequest
                {
                    Applicant = "张三",
                    Reason = "世界那么大,我想去看看",
                    LeaveDays = 2
                }
            };

            HR hR = new HR();
            hR.AddManager(new TL("李四"));
            hR.AddManager(new PM("王五"));
            hR.AddManager(new CTO("赵六"));

            Manager manager = hR.GetManager();
            manager.HandleRequest(context);
            if (context.Response == null)
            {
                Console.WriteLine($"{context.Request.LeaveDays}天假期太长,没人处理请假申请,请假失败");
            }
            else
            {
                Console.WriteLine($"{context.Response.Approver}审批了{context.Request.Applicant}的{context.Request.LeaveDays}天请假申请,请假事由{context.Request.Reason}");
            }
        }
    }

运行结果:

 

四、优缺点

优点

  1. 请求和处理分离,请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。

缺点

  1. 性能不高;
  2. 调试不很方便。

 

标签:set,get,模式,责任,Manager,context,public,LeaveContext
From: https://www.cnblogs.com/xiao-wo-niu/p/17460860.html

相关文章

  • 外观(门面)模式--Facade
    一、代码示例#include<iostream>usingnamespacestd;classCarmera{public:voidturnOn(){cout<<"相机启动"<<endl;}voidturnOff(){cout<<"相机关闭"<<endl;}};classLig......
  • 小话设计模式
    设计模式1关系......
  • 代理模式
    代理模式在代理模式(ProxyPattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。介绍意图:为其他对象提供一种代理以控制对这个对象的访问。主要解决:在直接访问对象时带来的问题,比如说:要访......
  • 抽象工厂模式
    抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成......
  • 工厂模式
    工厂模式工厂模式(FactoryPattern)是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。介绍意图:定义一个创建对象的接......
  • 单例模式
    单例模式单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不......
  • 设计模式目录
    目录抽象工厂模式代理模式单例模式工厂模式......
  • 观察者模式
    一、定义多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。二、示例下面用委托、事件,实现观察者模式1.Publisher.cs//定义发布者publicclassPublisher{//声明事件publiceventEv......
  • 【Java】再谈Springboot 策略模式
     第一次使用策略模式是一年前的一个项目:https://www.cnblogs.com/mindzone/p/16046538.html当时还不知道Spring支持集合类型的自动装配在最近一个项目,我发现很多业务需要频繁的使用这种模式去聚合代码 一、牛刀小试这是最开始的定义策略的业务接口/***业务推送管......
  • C++设计模式:观察者模式
    观察者模式又叫做发布-订阅模式;观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动的更新自己。有两大类(主题和观察者)一共四个角色从上面我们可以看到,这里面包含了:(1)抽象主题/抽象......