责任链模式
概念:
责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
使用场景
- hr筛选简历 -> 技术主管 -> 技术总监二面 -> 人资总监面试
- 每一环节的结果都是是可传递性的,也就是如果面试通过,就会到下一轮面试,成为一条传递链
代码演示
抽象出来面试官类
/**
* 抽象出来面试官类
*/
interface Interviewer {
/**
* 面试
*
* @return 返回面试结果
*/
boolean interview(Applicant applicant, Result result);
}
面试环节实现类
/**
* 笔试面试环节
*/
@Data
class InterviewiWritten implements Interviewer {
@Override
public boolean interview(Applicant applicant, Result result) {
System.out.println(applicant.getName() + "同学,进入笔试面试环节,应聘的岗位为:" + applicant.getJob());
result.setResult(result.getResult() + "笔试面试通过");
System.out.println(result.getResult());
result.setFlag(true);
return result.isFlag();
}
}
/**
* 技术首面
*/
class InterviewerLeader implements Interviewer {
@Override
public boolean interview(Applicant applicant, Result result) {
System.out.println(applicant.getName() + "同学,进入首轮技术面试环节,应聘的岗位为:" + applicant.getJob());
result.setResult(result.getResult() + "-->技术首面通过");
System.out.println(result.getResult());
result.setFlag(true);
return result.isFlag();
}
}
/**
* 技术经理二面
*/
class IntervewerManager implements Interviewer {
@Override
public boolean interview(Applicant applicant, Result result) {
System.out.println(applicant.getName() + "同学,进入二轮技术面试环节,应聘的岗位为:" + applicant.getJob());
result.setResult(result.getResult() + "-->技术二轮面试通过");
System.out.println(result.getResult());
result.setFlag(true);
return result.isFlag();
}
}
/**
* 人资终面
*/
class IntervewerHr implements Interviewer {
@Override
public boolean interview(Applicant applicant, Result result) {
System.out.println(applicant.getName() + "同学,进入人资面试环节,应聘的岗位为:" + applicant.getJob());
result.setResult(result.getResult() + "-->人资终面通过");
System.out.println(result.getResult());
result.setFlag(true);
return result.isFlag();
}
}
面试环节链
/**
* 面试流程链条
*/
@NoArgsConstructor
@AllArgsConstructor
class InterviewChain implements Interviewer {
List<Interviewer> chains = new CopyOnWriteArrayList<>();
/**
* @param interviewer
* @return this 可以采用链式编程
*/
InterviewChain add(Interviewer interviewer) {
chains.add(interviewer);
return this;
}
/**
* 面试流程链同样实现面试流程接口
*
* @param applicant
* @param result
* @return
*/
@Override
public boolean interview(Applicant applicant, Result result) {
for (Interviewer interviewer : chains) {
if (!interviewer.interview(applicant, result)) {
result.setFlag(false);
return result.isFlag();
}
}
return true;
}
}
定义应聘者和面试结果
/**
* 应聘者
*/
@Data
@AllArgsConstructor
class Applicant {
// 姓名
protected String name;
// 年龄
protected int age;
// 应聘岗位
protected String job;
}
/**
* 面试结果
*/
@Data
class Result {
// 面试结果
protected String result = "";
// 是否通过
protected boolean flag;
}
面试环节
/**
* 责任链模式
*
* @author liouwb
*/
public class ChainPatternTest {
public static void main(String[] args) {
// 面试者
Applicant applicant = new Applicant("liouwb", 28, "java");
// 面试结果
Result result = new Result();
result.setFlag(true);
// 面试流程链 添加面试流程 可以自定义调整
InterviewChain interviewChain = new InterviewChain();
interviewChain.add(new InterviewiWritten())
.add(new InterviewerLeader())
.add(new IntervewerManager())
.add(new IntervewerHr());
// 面试
interviewChain.interview(applicant, result);
}
}
执行结果:
liouwb同学,进入笔试面试环节,应聘的岗位为:java
笔试面试通过
liouwb同学,进入首轮技术面试环节,应聘的岗位为:java
笔试面试通过-->技术首面通过
liouwb同学,进入二轮技术面试环节,应聘的岗位为:java
笔试面试通过-->技术首面通过-->技术二轮面试通过
liouwb同学,进入人资面试环节,应聘的岗位为:java
笔试面试通过-->技术首面通过-->技术二轮面试通过-->人资终面通过
优点:
- 降低请求发送者和接收者之间的耦合度
- 增加了对象指派职责的灵活度、增强了可扩展性
- 将多个条件语句进行分散到各个具体处理类中,增加代码的可阅读性。使代码更加清晰,责任更明确
代码地址:
https://gitee.com/liouwb/design-mode/blob/master/src/ChainPatternTest.java