访问者模式
案例
张三所在公司欲为某高校开发一套奖励审批系统,该系统可以实现教师奖励和学生奖励的审批(Award Check),如果教师发表论文数超过10篇或者学生论文超过2篇可以评选科研奖,如果教师教学反馈分大于等于90分或者学生平均成绩大于等于90分可以评选成绩优秀奖。该系统主要用于判断候选人集合中的教师或学生是否符合某种获奖要求。张三想了想就开始动手写起来了。
1.首先他定义了一个父类:
// 父类,主要存放一些公共字段
public class Person {
// 姓名
private String name;
// 论文数
private int paperNums;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPaperNums() {
return paperNums;
}
public void setPaperNums(int paperNums) {
this.paperNums = paperNums;
}
}
2.然后分别是两个实体类:
老师类:
// 老师类
public class Teacher extends Person {
// 教学反馈分
private int feedbackScore;
public Teacher(String name, int paperNums, int feedbackScore) {
this.setName(name);
this.setPaperNums(paperNums);
this.feedbackScore = feedbackScore;
}
public int getFeedbackScore() {
return feedbackScore;
}
public void setFeedbackScore(int feedbackScore) {
this.feedbackScore = feedbackScore;
}
}
学生类:
// 学生类
public class Student extends Person {
// 平均成绩
private int averageScore;
public Student(String name, int paperNums, int averageScore) {
this.setName(name);
this.setPaperNums(paperNums);
this.averageScore = averageScore;
}
public int getAverageScore() {
return averageScore;
}
public void setAverageScore(int averageScore) {
this.averageScore = averageScore;
}
}
3.奖励审批系统关键代码:
// 奖励审批系统
public class AwardCheckSystem {
// 存放元素的容器
private List<Person> personList = new ArrayList<>();
// 添加元素方法
public void addPerson(Person person) {
personList.add(person);
}
// 系统判断评选资格核心代码
public void awardCheck(String prize) {
if (prize.equals("research")) {
for (Person person : personList) {
int paperNums = person.getPaperNums();
if (person instanceof Teacher && paperNums > 10) {
System.out.println(person.getName() + "老师发表论文数为:" + paperNums + ",拥有评选科研奖资格");
} else if (person instanceof Student && paperNums > 2) {
System.out.println(person.getName() + "同学发表论文数为:" + paperNums + ",拥有评选科研奖资格");
}
}
} else if (prize.equals("excellent")) {
for (Person person : personList) {
if (person instanceof Teacher && ((Teacher) person).getFeedbackScore()