责任链模式的简单介绍
责任链模式是为了帮助我们解决链条反应的一种模式,使相关责任的接口像多米诺骨牌一样,触发连锁反应。
责任链模式的类图:
责任链模式中各个角色的介绍:
- 抽象的处理器:定义处理器的结构
- 具体的处理器:继承抽象的处理器,重写处理请求
责任链模式的具体实现思路
- 创建抽象的处理器
- 创建具体的处理器,重写处理方法,使其具有向下调用其他处理器的能力
- 创建客户端,构建责任链,提交处理请求
责任链模式的具体实现方案
// 抽象处理器
public abstract class Handler {
private Handler next;
public void setNext(Handler next) {
this.next = next;
}
public Handler getNext() {
return next;
}
// 处理请求的方法
public abstract void handleRequest(String request);
}
// 具体处理器1
public class ConcreteHandler1 extends Handler {
public void handleRequest(String request) {
if ("one".equals(request)) {
System.out.println("处理器1负责处理该请求!");
} else {
if (getNext() != null) {
getNext().handleRequest(request);
} else {
System.out.println("没有人处理该请求!");
}
}
}
}
// 具体处理器2
public class ConcreteHandler2 extends Handler {
public void handleRequest(String request) {
if ("two".equals(request)) {
System.out.println("处理器2负责处理该请求!");
} else {
if (getNext() != null) {
getNext().handleRequest(request);
} else {
System.out.println("没有人处理该请求!");
}
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// 构建责任链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setNext(handler2);
// 提交请求
handler1.handleRequest("two");
}
}
责任链模式的优缺点
优点
- 进行对象之间的解耦。发送者和接收者也无须拥有对方的明确信息。
- 增强了给对象指派职责的灵活性。当流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
- 增强了系统的可扩展性。根据需求增加新的请求处理类即可,满足开闭原则。
- 简化了对象之间的连接。对象不需要知道链的结构。
- 明确各类的责任范围,每个类只需要做自己职责之内的事,职责之外的交给下个类去做,符合类的单一职责原则。
缺点
- 对于较长的责任链,系统性能会受到一定影响。
- 无法保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理。
- 职责链建立要靠客户端来维护,增加了客户端的复杂性,可能会造成循环调用等失误。
- 不易观察期运行时特征,对排除问题进行了一定的干扰。
责任链模式的适用场景
- 有多个处理器可以处理同一个请求,具体哪个处理器处理该请求由运行时刻自动确定。
- 在不明确指定处理器的情况下,向多个处理器中的每一个都提交一个请求。
- 动态指定一组处理器处理请求。
责任链模式总结
责任链模式就是巧妙的借助链表这种数据结构,让一系列处理者构成一个单链表,从而按照配置好的顺序,进行依次调用。使其能够避免请求的发送者与接收者耦合在一起,让多个请求的接收者可以构成一条链路,对请求按照链路的顺序进行处理。