责任链模式

2023-10-07 10:10:17 浏览数 (2)

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。客户端通过设置处理者的下一个处理者,形成了责任链。当请求到达责任链时,会依次由处理者判断是否能够处理,如果不能处理则传递给下一个处理者,直到有处理者处理请求或者责任链结束。

0 人点赞