1.概要
主要思想: 职责链模式通过将请求的发送者和接收者解耦,允许多个对象都有机会处理请求,请求沿着一条责任链传递,直到有一个对象处理它或者所有对象都无法处理为止。
实现方式:
- 定义抽象处理者(Handler)角色:定义处理请求的接口,包含处理请求的方法。
- 具体处理者(Concrete Handler)角色:实现抽象处理者接口,处理请求,若无法处理则将请求传递给下一个处理者。
- 客户端(Client):创建责任链,将请求发送到责任链的第一个处理者。
适用场景:
- 当请求的发送者和接收者之间的关系不明确时,希望动态指定处理链时。
- 当多个对象可以处理同一个请求,具体的处理者在运行时确定。
- 当请求需要被处理的对象多于一个时,但是不明确哪个对象会处理。
- 当希望系统自动传递请求时,将请求传递给合适的处理者。
优点:
- 降低耦合度:请求发送者和接收者之间解耦,可以灵活添加或修改处理者。
- 动态建立处理链:可以根据需要动态地建立职责链。
缺点:
- 性能问题:责任链太长或处理者对象太多,可能影响性能。
- 请求不一定被处理:如果责任链没有被正确配置,请求可能无法被处理。
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); // 请求会沿着责任链传递,直到被处理
}
}
在这个示例中,ConcreteHandler1
和ConcreteHandler2
是具体的处理者,它们继承自抽象处理者Handler
。客户端通过设置处理者的下一个处理者,形成了责任链。当请求到达责任链时,会依次由处理者判断是否能够处理,如果不能处理则传递给下一个处理者,直到有处理者处理请求或者责任链结束。