该系列文章为博主学习笔记,原文请参考参考链接
本文禁止转载,但是欢迎大家留言区留言交流[微笑]
访问者模式特(面)点(试):以不同的方式操作复杂对象结构。访问者模式包含访问者和被访问元素两个主要组成部分,相同的访问者可以以不同的方式访问不同的元素,相同的元素可以接受不同访问者以不同访问方式访问。
例题:
//抽象元素
interface Person {
public void accept(School school);
}
//具体元素
public class Children implements Person {
//学生姓名
private String name;
//学生论文
private int paper;
//平均分
private int average;
public Children(String name, int paper, int average) {
this.name = name;
this.paper = paper;
this.average = average;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPaper() {
return paper;
}
public void setPaper(int paper) {
this.paper = paper;
}
public int getAverage() {
return average;
}
public void setAverage(int average) {
this.average = average;
}
@Override
public void accept(School school) {
school.visit(this);
}
}
//具体元素
public class Teacher implements Person {
//教师姓名
private String name;
//教师论文
private int paper;
//反馈分
private int feedback;
public Teacher(String name, int paper, int feedback) {
this.name = name;
this.paper = paper;
this.feedback = feedback;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPaper() {
return paper;
}
public void setPaper(int paper) {
this.paper = paper;
}
public int getFeedback() {
return feedback;
}
public void setFeedback(int feedback) {
this.feedback = feedback;
}
@Override
public void accept(School school) {
school.visit(this);
}
}
//学校类:访问者
public abstract class School {
public abstract void visit(Children person);
public abstract void visit(Teacher person);
}
//学生处类,用于统计学生平局分数和老师的反馈分数:具体访问者
public class StudentDepartment extends School{
@Override
public void visit(Children person) {
String name = person.getName();
int average = person.getAverage();
if (average>90){
System.out.println("姓名 "+name+" 可以评选成绩优秀奖");
}
}
@Override
public void visit(Teacher person) {
String name = person.getName();
int feedback = person.getFeedback();
if (feedback>90){
System.out.println("姓名 "+name+" 可以评选成绩优秀奖");
}
}
}
//教导处类,用于统计学生和老师的论文数量:具体访问者
public class EducationDepartment extends School{
@Override
public void visit(Children person) {
String name = person.getName();
int paper = person.getPaper();
if (paper>2){
System.out.println("姓名 "+name+" 可以评选科研奖");
}
}
@Override
public void visit(Teacher person) {
String name = person.getName();
int paper = person.getPaper();
if (paper>10){
System.out.println("姓名 "+name+" 可以评选科研奖");
}
}
}
//对象结构
public class StudentList {
private ArrayList<Person> list = new ArrayList<Person>();
public void addPerson(Person person) {
list.add(person);
}
public void accept(School school) {
for (Object obj : list) {
((Person) obj).accept(school);
}
}
}
public class MyClass {
public static void main(String[] args) {
StudentList studentList = new StudentList();
Person person1, person2, person3, person4;
person1 = new Children("小王", 1, 89);
person2 = new Children("小李", 3, 92);
person3 = new Teacher("王老师", 11, 99);
person4 = new Teacher("张老师", 7, 60);
studentList.addPerson(person1);
studentList.addPerson(person2);
studentList.addPerson(person3);
studentList.addPerson(person4);
EducationDepartment educationDepartment = new EducationDepartment();
studentList.accept(educationDepartment);
}
}
输出:
姓名 小李 可以评选科研奖
姓名 王老师 可以评选科研奖
该模式主要通过StudentList类,存储了所有被访问的对象(被访问的对象可能不止一种,通过集合添加,这里为Children和Teacher两个类)。通过调用accept方法,里面传入的是访问者。本例子中传入的是EducationDepartment(教导处对象,分别对学生和老师的论文数量进行处理,判断是否可以评选科研奖)。之后分别调用了Children和Teacher两个对象中的accept方法(并传入this对象),最后调用了访问者(EducationDepartment)类中的visit方法,分别对教师类和孩子类进行处理。
微信公众号:
QQ交流群:365473065