概念:
职责链模式是一种行为设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求为止。每个处理者都可以选择将请求传递给下一个处理者或自行处理。
特点:
- 解耦发送者和接收者:发送者不需要知道具体的接收者,只需将请求发送给第一个处理者即可。
- 动态组合:可以根据需要动态地组合和调整职责链中的各个节点。
- 灵活性:可以灵活地添加、修改或删除职责链上的节点。
优点:
- 提高代码复用性:每个节点都只关心自己负责的部分,易于扩展和维护。
- 易于扩展新功能:通过增加新的节点来扩展功能而无需修改现有代码。
- 可以动态改变顺序和条件:可以根据实际情况动态调整节点之间的顺序或添加条件判断。
缺点:
- 请求可能无法被正确处理:如果没有合适的节点能够处理某个请求,则该请求可能会被忽略。
- 性能开销较大:由于需要遍历整个职责链来找到合适的处理器,因此在大型职责链中可能会影响性能。
适用场景:
- 有多个对象可以处理同一请求,但具体的处理者在运行时才能确定。
- 需要动态地指定可处理请求的对象集合。
- 在不明确接收者的情况下,将一个请求传递给多个对象中的一个或几个。
实现方式:
链表方式
使用链表或数组来存储职责链节点,并在每个节点中定义一个方法来处理请求。每个节点都持有下一个节点的引用
实现原理:
- 创建一个抽象的处理者类,其中包含一个指向下一处理者的引用。
- 派生具体的处理者类,并重写父类中的方法,在该方法中判断是否能够处理请求,如果可以则进行处理;否则将请求传递给下一位处理者。
- 在客户端代码中创建职责链并连接各个节点。
实现代码:
// 抽象处理者类
abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}
public abstract void handleRequest(Request request);
}
// 具体处理者类A
class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeA")) {
// 处理请求
System.out.println("ConcreteHandlerA处理了请求:" + request.getContent());
} else {
// 无法处理,传递给下一个处理者
if (nex