C#设计模式17——责任链模式的写法

发布时间 2023-05-09 22:44:21作者: 明志德道

是什么:

责任链模式是一种行为型设计模式,它允许对象组成一个链并依次检查另一个对象是否可以处理请求。如果一个对象可以处理请求,它处理请求,并且负责将请求传递给下一个对象,直到请求被处理为止。

为什么:

责任链模式可以降低系统中对象之间的耦合度,并提高系统的灵活性和可维护性。同时,它还可以减少了客户端与各个处理对象的耦合,使得客户端不需要知道哪个具体的处理对象来处理请求。

怎么做:

在责任链模式中,我们定义了一个抽象处理者接口 Handler,它定义了处理请求的方法 HandleRequest,并持有一个对下一个处理者的引用。接下来,我们定义了一些具体的处理者类 ConcreteHandlerA,ConcreteHandlerB 等,并实现了 Handler 接口中的 HandleRequest 方法。在具体实现中,每个处理者对象都能判断自己是否具备处理该请求的能力,如果能够处理,则直接处理;如果不能处理,则将请求转发给下一个处理者对象。如果到了链的末端,即没有任何一个处理者对象能够处理该请求,则该请求会被默认处理或者被丢弃。

下面是在 C# 语言中实现责任链模式的一个示例代码:

// 抽象处理者
public abstract class Handler
{
    protected Handler nextHandler; // 持有对下一个处理者的引用

    public void SetNextHandler(Handler nextHandler)
    {
        this.nextHandler = nextHandler;
    }

    public abstract void HandleRequest(int request);
}

// 具体处理者 A
public class ConcreteHandlerA : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 0 && request <= 10)
        {
            Console.WriteLine("ConcreteHandlerA 处理请求: " + request);
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无法处理请求: " + request);
        }
    }
}

// 具体处理者 B
public class ConcreteHandlerB : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 11 && request <= 20)
        {
            Console.WriteLine("ConcreteHandlerB 处理请求: " + request);
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无法处理请求: " + request);
        }
    }
}

// 具体处理者 C
public class ConcreteHandlerC : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 21 && request <= 30)
        {
            Console.WriteLine("ConcreteHandlerC 处理请求: " + request);
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无法处理请求: " + request);
        }
    }
}

在这个代码示例中,我们定义了一个抽象处理者 Handler,并在其中定义了一个对下一个处理者的引用 nextHandler。接下来,我们定义了三个具体处理者 ConcreteHandlerA,ConcreteHandlerB 和 ConcreteHandlerC,并实现了 Handler 接口中的 HandleRequest 方法。在 HandleRequest 方法中,每个具体处理者对象都会根据自己的能力判断是否能够处理该请求,如果能够处理,则直接处理;否则将请求转发给下一个处理者对象。

何时使用:

当一个系统需要处理一些请求,并且每个请求可以有多个处理者对象可以处理时,可以考虑采用责任链模式。此外,责任链模式还适用于系统中的对象具有强耦合关系时,将其解耦可以提高系统的灵活性和可维护性。