1. 责任链模式
1.1 介绍
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了。
1.2 优缺点
优点
- 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
- 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
- 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
- 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
- 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
缺点
-
不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
-
对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
-
职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。
1.3 使用场景
-
有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
-
在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
-
可动态指定一组对象处理请求。
1.4 注意事项
2. 案例代码
走着走着,我在路上碰见我朋友了,我朋友说要借车用一下,并且带我去一个地方,我一个人不能决定,因此我要告诉我爸爸妈妈,如果他们同意的话我就去。
public abstract class Approver {
public static int FIRST = 1;
public static int SECOND = 2;
public static int THIRD = 3;
protected int level;
protected Approver nextApprover;
public void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
public void logMessage(int level, String message){
if(this.level >= level){
write(message);
}
if(nextApprover != null){
nextApprover.logMessage(level,message);
}
}
protected abstract void write(String message);
}
public class Me extends Approver {
public Me(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("我同意"+message+"借车");
}
}
public class Mother extends Approver {
public Mother(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("妈妈同意"+message+"借车");
}
}
public class Father extends Approver {
public Father(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("爸爸同意"+message+"借车");
}
}
/**
* 责任链模式
*
*@Author cly
*@Date 2021/08/31 20:28
*@Version 1.0
*/
public class ChainOfResponsibility {
// 构造责任链
private static Approver getApprover(){
Me me = new Me(Approver.FIRST);
Mother mother = new Mother(Approver.SECOND);
Father father = new Father(Approver.THIRD);
me.setNextApprover(mother);
mother.setNextApprover(father);
return me;
}
public static void main(String[] args) {
Approver approver = getApprover();
approver.logMessage(1,"我朋友");
System.out.println();
approver.logMessage(2,"妈妈朋友");
System.out.println();
approver.logMessage(3,"爸爸朋友");
}
}
3. 源码实现
3.1 异常机制
Java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch;
3.2 事件冒泡
Javascript语言中,事件的冒泡和捕获机制。