设计模式,行为模式之责任链模式
public enum Major {
JAVA, PYTHON, NA
}
// 面试候选人
public class Interviewee {
private String name;
private Major major;
public Interviewee(String name, Major major) {
this.name = name;
this.major = major;
}
public String getName() { return name; }
public Major getMajor() { return major; }
@Override
public String toString() {
return "Interviewee " + name + ", majors in " + major;
}
}
// 面试官,子类需要实现自己的面试方法
public abstract class Interviewer {
private Major major;
protected Interviewer nextInterviewer;
public Interviewer(Major major) {
this.major = major;
}
public Major getMajor() { return major; }
// 重要方法:设置下一个面试官,形成责任链
public void setNext(Interviewer nextInterviewer) {
this.nextInterviewer = nextInterviewer;
};
public abstract boolean interview(Interviewee interviewee);
}
// java面试官
public class JavaInterviewer extends Interviewer {
public JavaInterviewer() {
super(Major.JAVA);
}
@Override
public boolean interview(Interviewee interviewee) {
if (interviewee.getMajor().equals(this.getMajor())) {
// 当领域对应的时候,才进行面试
System.out.println(interviewee.getName() + " is on java interview.");
if (new Random().nextInt(10) <= 8) {// 模拟面试结果
System.out.println(interviewee.getName() + " passed java interview!");
}
else {
System.out.println(interviewee.getName() + " failed on java interview!");
return false;
}
}
else {
// 如果领域不对应,直接传给下一个面试官
System.out.println("Java interviewer will not do interview on " + interviewee.getName());
}
if (nextInterviewer != null) {
// 传给下一个面试官
return nextInterviewer.interview(interviewee);
}
return true;
}
}
// python面试官
public class PythonInterviewer extends Interviewer {
public PythonInterviewer() {
super(Major.PYTHON);
}
@Override
public boolean interview(Interviewee interviewee) {
if (interviewee.getMajor().equals(this.getMajor())) {
// 当领域对应的时候,才进行面试
System.out.println(interviewee.getName() + " is on python interview.");
if (new Random().nextInt(10) <= 8) {// 模拟面试结果
System.out.println(interviewee.getName() + " passed python interview!");
}
else {
System.out.println(interviewee.getName() + " failed on python interview!");
return false;
}
}
else {
// 如果领域不对应,直接传给下一个面试官
System.out.println("Python interviewer will not do interview on " + interviewee.getName());
}
if (nextInterviewer != null) {
// 传给下一个面试官
return nextInterviewer.interview(interviewee);
}
return true;
}
}
// HR面试官
public class HRInterviewer extends Interviewer {
public HRInterviewer() {
super(null);// no major for HR
}
@Override
public boolean interview(Interviewee interviewee) {
System.out.println(interviewee.getName() + " is on HR interview.");
if (new Random().nextInt(10) <= 9) {// 模拟面试结果
System.out.println(interviewee.getName() + " passed hr interview!");
}
else {
System.out.println(interviewee.getName() + " failed on hr interview!");
return false;
}
if (nextInterviewer != null) {
// 传给下一个面试官
return nextInterviewer.interview(interviewee);
}
return true;
}
}
// 责任链对象
public class InterviewProcess {
// 只需只有第一个面试官的引用,请求会自动往后传
Interviewer firstInterviewer;
public InterviewProcess() {
// 设置责任链
Interviewer javaInterviewer = new JavaInterviewer();
Interviewer pythonInterviewer = new PythonInterviewer();
Interviewer hrInterviewer = new HRInterviewer();
javaInterviewer.setNext(pythonInterviewer);
pythonInterviewer.setNext(hrInterviewer);
this.firstInterviewer = javaInterviewer;
}
public boolean process(Interviewee interviewee) {
return firstInterviewer.interview(interviewee);
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
InterviewProcess interviewProcess = new InterviewProcess();
Interviewee mario = new Interviewee("Mario", Major.JAVA);
Interviewee link = new Interviewee("Link", Major.PYTHON);
System.out.println(mario + " is taking interview...");
boolean result = interviewProcess.process(mario);
System.out.println("Interview result of " + mario.getName() + ": " + (result ? "pass" : "fail"));
System.out.println("==================================");
System.out.println(link + " is taking interview...");
result = interviewProcess.process(link);
System.out.println("Interview result of " + mario.getName() + ": " + (result ? "pass" : "fail"));
}
}