ChainOfResponsibilityPattern-责任链模式

在C#中,责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它可让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。请求沿着一个链传递,直到有一个对象处理它为止。

责任链模式有以下几个关键角色:

Handler(处理器):定义处理请求的接口,并通常持有一个指向下一个处理器的引用。

ConcreteHandler(具体处理器):实现处理请求的接口,并决定是否能够处理该请求,如果不能处理则将请求传递给下一个处理器。

下面是一个示例,展示如何在C#中使用责任链模式来实现一个简单的请假审批系统:

namespace ChainOfResponsibilityPattern_责任链模式
{
    public class ChainOfResponsibility
    {
        public abstract class LeaveRequestHandler
        {
            protected LeaveRequestHandler NextHandler;

            public void SetNextHandler(LeaveRequestHandler nextHandler)
            {
                NextHandler = nextHandler;
            }

            public abstract void HandleRequest(LeaveRequest request);
        }
        // ConcreteHandler
        public class SupervisorHandler : LeaveRequestHandler
        {
            public override void HandleRequest(LeaveRequest request)
            {
                if (request.Days <= 3)
                {
                    Console.WriteLine("Leave request approved by supervisor");
                }
                else if (NextHandler != null)
                {
                    NextHandler.HandleRequest(request);
                }
            }
        }
        public class ManagerHandler : LeaveRequestHandler
        {
            public override void HandleRequest(LeaveRequest request)
            {
                if (request.Days <= 5)
                {
                    Console.WriteLine("Leave request approved by manager");
                }
                else if (NextHandler != null)
                {
                    NextHandler.HandleRequest(request);
                }
            }
        }
        public class HRHandler : LeaveRequestHandler
        {
            public override void HandleRequest(LeaveRequest request)
            {
                if (request.Days <= 7)
                {
                    Console.WriteLine("Leave request approved by HR");
                }
                else
                {
                    Console.WriteLine("Leave request denied");
                }
            }
        }
        // LeaveRequest
        public class LeaveRequest
        {
            public int Days { get; set; }
        }

    }
}
namespace ChainOfResponsibilityPattern_责任链模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            LeaveRequestHandler supervisor = new SupervisorHandler();
            LeaveRequestHandler manager = new ManagerHandler();
            LeaveRequestHandler hr = new HRHandler();

            supervisor.SetNextHandler(manager);
            manager.SetNextHandler(hr);

            LeaveRequest request = new LeaveRequest { Days = 2 };
            supervisor.HandleRequest(request);

            request = new LeaveRequest { Days = 6 };
            supervisor.HandleRequest(request);

            request = new LeaveRequest { Days = 10 };
            supervisor.HandleRequest(request);

            Console.Read();

            //输出结果
            //Leave request approved by supervisor
            //Leave request approved by HR
            //Leave request denied
        }
    }
}

通过使用责任链模式,可以让多个对象都有机会处理请求,避免请求发送者和接收者之间的紧耦合关系。可以根据实际需求创建不同的责任链,并按照顺序进行处理。此外,责任链模式还具有灵活性,可以动态地改变链中的处理顺序或添加新的处理器。

 

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到有一个对象能够处理请求为止。责任链模式具有以下优点和缺点:

优点:

  1. 解耦请求发送者和接收者:责任链模式将请求发送者和接收者解耦,每个接收者只需关心自己能够处理的请求,不需要知道请求的来源和最终的处理者,降低了类之间的耦合度。

  2. 可扩展性和灵活性:责任链模式允许新增、修改和删除处理者对象,而不会影响请求发送者和其他接收者。可以根据需求动态调整处理者对象的顺序和逻辑,提供了灵活性和可扩展性。

  3. 支持动态组合和配置:责任链模式可以通过动态组合和配置处理者对象,实现对请求处理逻辑的动态调整。可以根据需求将处理者对象以不同的顺序组合起来,轻松实现复杂的请求处理流程。

  4. 可以处理系统中的多个请求类型:责任链模式可以处理系统中的多个请求类型,每个请求类型都有对应的处理者链。可以通过判断请求类型来选择对应的处理者链进行处理。

缺点:

  1. 请求可能无法被处理:责任链模式中,如果存在一条链上的所有处理者都无法处理请求,可能会导致请求无法被处理。需要注意设置合理的默认处理者或者终止条件,以确保请求能够得到处理。

  2. 可能导致性能问题:责任链模式中,每个请求都需要遍历整个处理者链,直到找到能够处理请求的处理者为止。如果处理者链过长或者处理逻辑复杂,可能会导致性能问题。

  3. 可能影响代码的可读性:责任链模式将请求的处理分散到多个处理者对象中,可能会影响代码的可读性和理解难度。需要注意良好的命名和注释,以便于他人理解代码逻辑。

需要根据具体的应用场景和需求来评估使用责任链模式的利弊。责任链模式适用于存在多个处理者对象,且每个处理者对象都有能力处理部分请求的场景。通过权衡其优点和缺点,可以选择是否使用责任链模式。

posted @ 2023-08-22 09:44  ZHIZRL  阅读(11)  评论(0编辑  收藏  举报