Skip to content

责任链模式

一种将请求的发送者与接收者解耦的设计模式,让多个对象都有机会处理这个请求。

使用的场景

适合出现这些情况时用:

  • 请求的处理者不止一个,而且可能需要多层判断

  • 希望动态决定由谁处理,而不是写死

  • 不想让请求发送者知道具体谁会处理,去耦合

举例:

  • UI输入事件(点击传给最顶层,没人处理就传给底层)

  • 日志系统(不同级别日志由不同处理器管)

  • 游戏中的角色行为触发链

  • 聊天机器人指令处理链(一个接一个尝试处理)

“我处理不了,就丢给下一个吧~”

一串对象像链条一样串起来,请求会顺着这条链传下去,直到有人处理它为止

基本结构

  • Handler接口:定义一个方法用于处理请求。

  • ConcreteHandler类:实现Handler接口,包含请求处理逻辑和对下一个处理者的引用。

plain text
Request ——> [HandlerA] ——> [HandlerB] ——> [HandlerC] …… 直到某个节点处理成功或结束

每个 Handler 有两个核心动作:

  • 判断自己能不能处理

  • 不行就把请求传给下一个 Handler

示例

csharp
// 抽象处理者
abstract class Handler 
{
    protected Handler Next;
    public void SetNext(Handler next) => Next = next;
    public abstract void Handle(string request);
}

// 具体处理者A
class LowLevelHandler : Handler 
{
    public override void Handle(string request) 
    {
        if (request == "low") 
        {
            Console.WriteLine("LowLevelHandler handled it!");
        } 
        else 
        {
            Next?.Handle(request); // 传给下一个
        }
    }
}

// 具体处理者B
class HighLevelHandler : Handler 
{
    public override void Handle(string request) 
    {
        if (request == "high") 
        {
            Console.WriteLine("HighLevelHandler handled it!");
        } 
        else 
        {
            Next?.Handle(request);
        }
    }
}

// 使用
var low = new LowLevelHandler();
var high = new HighLevelHandler();
low.SetNext(high);

low.Handle("low");   // ➜ LowLevelHandler handled it!
low.Handle("high");  // ➜ HighLevelHandler handled it!
low.Handle("unknown"); // ➜ 没人处理

GDScript示例

gdscript
# 基类
class Handler:
    var next_handler: Handler = null

    func handle(request: String) -> void:
        if next_handler:
            next_handler.handle(request)

# 低级处理者
class LowHandler extends Handler:

    func handle(request: String) -> void:
        if request == "low":
            print("LowHandler handled it!")
        else:
            super(request)

# 高级处理者
class HighHandler extends Handler:

    func handle(request: String) -> void:
        if request == "high":
            print("HighHandler handled it!")
        else:
            super(request)

# 测试
func _ready():
    var low = LowHandler.new()
    var high = HighHandler.new()
    low.next_handler = high

    low.handle("low")      # ➜ LowHandler handled it!
    low.handle("high")     # ➜ HighHandler handled it!
    low.handle("unknown")  # ➜ 没人处理