【设计模式】责任链模式

目录

概述

优点

缺点

UML类图

示例代码


概述

        责任链模式是一种行为型设计模式,它允许多个对象来处理同一个请求,形成一条责任链,直到有一个对象处理了该请求或者请求到达链的末尾。责任链模式将请求发送者和接收者解耦,使得请求发送者不需要知道具体的接收者是谁,只需要将请求发送给责任链,由责任链来决定如何处理请求。

        责任链模式通常包含两个角色:抽象处理者和具体处理者。抽象处理者定义了处理请求的接口,包含了一个指向下一个处理者的引用。具体处理者继承自抽象处理者,实现了处理请求的具体逻辑,如果自己无法处理该请求,就将请求传递给下一个处理者。

优点

        责任链模式的优点在于它可以将请求发送者和接收者解耦,使得请求发送者不需要知道具体的接收者是谁,只需要将请求发送给责任链,由责任链来决定如何处理请求。责任链模式还可以动态地修改责任链,增加或删除处理者,从而改变责任链的处理流程。

缺点

        责任链模式的缺点在于它可能会导致请求被多次处理,因为每个处理者都可以决定是否将请求传递给下一个处理者。此外,责任链模式还可能会降低系统的性能和效率,因为它需要遍历整个责任链来寻找能够处理请求的处理者。

UML类图

        下面是责任链模式的UML类图:

        在UML类图中,Handler是抽象处理者,它包含了一个指向下一个处理者的引用和处理请求的抽象方法HandleRequest。ConcreteHandler是具体处理者,它们继承自Handler,实现了HandleRequest方法。客户端通过Handler来发送请求,由责任链来决定如何处理请求。

 

示例代码

下面是责任链模式的示例代码:

// 抽象处理者
public abstract class Handler
{
    protected Handler _nextHandler;

    public void SetNextHandler(Handler nextHandler)
    {
        _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($"{this.GetType().Name}处理了请求:{request}");
        }
        else if (_nextHandler != null)
        {
            _nextHandler.HandleRequest(request);
        }
    }
}

// 具体处理者B
public class ConcreteHandlerB : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 10 && request < 20)
        {
            Console.WriteLine($"{this.GetType().Name}处理了请求:{request}");
        }
        else if (_nextHandler != null)
        {
            _nextHandler.HandleRequest(request);
        }
    }
}

// 具体处理者C
public class ConcreteHandlerC : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 20 && request < 30)
        {
            Console.WriteLine($"{this.GetType().Name}处理了请求:{request}");
        }
        else if (_nextHandler != null)
        {
            _nextHandler.HandleRequest(request);
        }
    }
}

// 客户端
public class Client
{
    static void Main()
    {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        handlerA.SetNextHandler(handlerB);
        handlerB.SetNextHandler(handlerC);

        int[] requests = { 2, 14, 25, 30 };

        foreach (int request in requests)
        {
            handlerA.HandleRequest(request);
        }
    }
}

        在上面的示例代码中,Handler是抽象处理者,它包含了一个指向下一个处理者的引用和处理请求的抽象方法HandleRequest。ConcreteHandlerA、ConcreteHandlerB和ConcreteHandlerC是具体处理者,它们继承自Handler,实现了HandleRequest方法。

        在客户端中,首先创建了三个具体处理者对象,然后通过SetNextHandler方法将它们连接起来,形成一条责任链。最后,客户端发送了一系列请求,每个请求都被发送到责任链的头部,由责任链来决定如何处理请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值