责任链模式
一种将请求的发送者与接收者解耦的设计模式,让多个对象都有机会处理这个请求。
使用的场景
适合出现这些情况时用:
请求的处理者不止一个,而且可能需要多层判断
希望动态决定由谁处理,而不是写死
不想让请求发送者知道具体谁会处理,去耦合
举例:
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") # ➜ 没人处理