设计模式,行为模式之责任链模式

时间:2025-03-08 08:56:38
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")); } }