责任链模式
-
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
-
优点:1)降低耦合度。它将请求的发送者和接收者解耦。 2)简化了对象。使得对象不需要知道链的结构。 3)增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4)增加新的请求处理类很方便。
-
缺点:1)不能保证请求一定被接收。 2)系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3)可能不容易观察运行时的特征,有碍于除错。
-
博客:https://hanchao.blog.csdn.net/article/details/97285508
-
实例:多轮面试场景:招聘流程:笔试面试ExamInterview、技术面试TechnicalInterview、HR面试HRInterview。每轮面试的内容各不相同,如果不能达到本轮面试标准,则被淘汰。需求变化:有可能添加CEO面试CEOInterview,减少笔试等等;针对不同的求职者可能有不同的面试安排。
-
类图:
- 代码:
/**
* 抽象面试类
*/
public abstract class Interview {
/**
* 下一轮面试(可类比链表的下一个节点)
*/
private Interview interview;
public Interview(Interview interview) {
this.interview = interview;
}
public Interview getInterview() {
return interview;
}
/**
* 进行面试
*/
public abstract String runInterview(String name);
}
/**
* 笔试
*/
public class ExamInterview extends Interview {
public ExamInterview(Interview interview) {
super(interview);
}
@Override
public String runInterview(String name) {
System.out.println(name + "开始参加笔试");
System.out.println("此轮笔试共计10道选择题,5道机试题,共计100分,答题时间60分钟。");
int score = new Random().nextInt(50) + 50;
if (score >= 60) {
System.out.println(name + " 笔试得分为 " + score + " 通过了笔试。");
} else {
System.out.println(name + " 笔试得分为 " + score + ", 未通过笔试。");
return "面试结果:未通过笔试";
}
System.out.println(name + " 进入下一轮面试。");
System.out.println("--------------------------------");
return super.getInterview().runInterview(name);
}
}
/**
* 技术面试
*/
public class TechnicalInterview extends Interview {
public TechnicalInterview(Interview interview) {
super(interview);
}
@Override
public String runInterview(String name) {
//技术面试
System.out.println(name + " 开始参加技术面试");
System.out.println("技术面试官先问了一些基础知识");
boolean pass = new Random().nextBoolean();
if (pass) {
System.out.println(name + " 基础知识回答得很完美,继续技术面试。");
} else {
System.out.println(name + " 基础知识掌握的很差,未通过技术面试。");
return "面试结果:未通过技术面试";
}
System.out.println("技术面试官又问了一些高级知识");
pass = new Random().nextBoolean();
if (pass) {
System.out.println(name + " 高级知识回答得马马虎虎,继续技术面试。");
} else {
System.out.println(name + " 高级知识简直是不懂装通,未通过技术面试。");
return "面试结果:未通过技术面试";
}
System.out.println(name + " 进入下一轮面试。");
System.out.println("--------------------------------");
return super.getInterview().runInterview(name);
}
}
/**
* HR面试
*/
public class HRInterview extends Interview {
public HRInterview(Interview interview) {
super(interview);
}
@Override
public String runInterview(String name) {
//HR面试
System.out.println(name + " 开始参加HR面试");
System.out.println("HR先聊了聊公司的背景、现状、前景...");
System.out.println(name + " 反映很满意。");
System.out.println("HR开始谈工资。");
int score = new Random().nextInt(10) + 20;
if (score <= 25) {
System.out.println(name + " 期望工资涨幅为" + score + "%,在HR承受范围内,通过了面试。");
} else {
System.out.println(name + " 期望工资涨幅为" + score + "%,超出HR承受范围内,未通过面试。");
return "面试结果:未通过HR面试";
}
System.out.println(name + " 进入下一轮面试。");
System.out.println("--------------------------------");
return super.getInterview().runInterview(name);
}
}
/**
* 责任节点,通过面试
*/
public class PassInterview extends Interview {
public PassInterview() {
super(null);
}
@Override
public String runInterview(String name) {
System.out.println(name + " 通过了所有面试,恭喜你!");
return "通过了所有面试,恭喜你!";
}
}
/**
* 测试责任链模式
*/
public class TestChainOfResponsibility {
public static void main(String[] args) {
//1.普通求职者王五的面试过程
String name1 = "王五";
new ExamInterview(new TechnicalInterview(new HRInterview(new PassInterview()))).runInterview(name1);
System.out.println();
//1.高级求职者张三的面试过程
String name2 = "张三";
new TechnicalInterview(new HRInterview(new PassInterview())).runInterview(name2);
}
}