前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >责任链模式

责任链模式

作者头像
JusterZhu
发布2023-10-07 10:10:17
1210
发布2023-10-07 10:10:17
举报
文章被收录于专栏:JusterZhuJusterZhu

1.概要

主要思想: 职责链模式通过将请求的发送者和接收者解耦,允许多个对象都有机会处理请求,请求沿着一条责任链传递,直到有一个对象处理它或者所有对象都无法处理为止。

实现方式:

  1. 定义抽象处理者(Handler)角色:定义处理请求的接口,包含处理请求的方法。
  2. 具体处理者(Concrete Handler)角色:实现抽象处理者接口,处理请求,若无法处理则将请求传递给下一个处理者。
  3. 客户端(Client):创建责任链,将请求发送到责任链的第一个处理者。

适用场景:

  • 当请求的发送者和接收者之间的关系不明确时,希望动态指定处理链时。
  • 当多个对象可以处理同一个请求,具体的处理者在运行时确定。
  • 当请求需要被处理的对象多于一个时,但是不明确哪个对象会处理。
  • 当希望系统自动传递请求时,将请求传递给合适的处理者。

优点:

  1. 降低耦合度:请求发送者和接收者之间解耦,可以灵活添加或修改处理者。
  2. 动态建立处理链:可以根据需要动态地建立职责链。

缺点:

  1. 性能问题:责任链太长或处理者对象太多,可能影响性能。
  2. 请求不一定被处理:如果责任链没有被正确配置,请求可能无法被处理。

2.详细内容

代码示例

代码语言:javascript
复制
//定义抽象处理者(Handler)类:创建一个抽象类或接口,包含处理请求的方法,并声明一个用于设置下一个处理者的属性。
abstract class Handler
{
    protected Handler nextHandler;
    
    public void SetNextHandler(Handler handler)
    {
        nextHandler = handler;
    }

    public abstract void HandleRequest(int request);
}

//创建具体处理者(Concrete Handler)类:实现抽象处理者类,处理请求。如果能处理请求,则处理;否则,将请求传递给下一个处理者。
class ConcreteHandler1 : Handler
{
    public override void HandleRequest(int request)
    {
        if (request == 1)
        {
            // 处理请求的逻辑
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
    }
}
//在客户端代码中创建责任链:实例化具体处理者类,并设置它们的下一个处理者。
class Client
{
    static void Main(string[] args)
    {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        
        handler1.SetNextHandler(handler2);
        // 可以继续设置更多的处理者

        handler1.HandleRequest(1); // 请求会沿着责任链传递,直到被处理
    }
}

在这个示例中,ConcreteHandler1ConcreteHandler2是具体的处理者,它们继承自抽象处理者Handler。客户端通过设置处理者的下一个处理者,形成了责任链。当请求到达责任链时,会依次由处理者判断是否能够处理,如果不能处理则传递给下一个处理者,直到有处理者处理请求或者责任链结束。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-06 11:39,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JusterZhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.概要
  • 2.详细内容
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档