访问者模式是一个多对多的关系
一个公共抽象类:属性和accept方法,用来接收访问者
实现抽象类的N个类
一个抽象接口 里面定义要访问N个类的方法
实现抽象接口的 N个类
public abstract class User {
public String name;
public String identity; // 身份
public String clazz;
public User(String name, String identity, String clazz){
this.name = name;
this.identity = identity;
this.clazz = clazz;
}
public abstract void accept(Visitor visitor);
}
public class Student extends User{
public Student(String name, String identity, String clazz)
{
super(name, identity, clazz);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class Teacher extends User{
public Teacher(String name, String identity, String clazz) {
super(name, identity, clazz);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public interface Visitor {
public void visit(Student student);
public void visit(Teacher teacher);
}
public class Parent implements Visitor{
@Override
public void visit(Student student) {
System.out.println("学生" + student.name + ",老师" + student.clazz );
}
@Override
public void visit(Teacher teacher) {
System.out.println("老师" + teacher.name + ",身份" + teacher.clazz );
}
}
public class Principal implements Visitor{
@Override
public void visit(Student student) {
System.out.println("学生" + student.name + "的学号是:" + student.identity);
}
@Override
public void visit(Teacher teacher) {
System.out.println("老师" + teacher.name + "班级:" + teacher.clazz);
}
}
@SpringBootApplication
public class VisitorApplication {
public static void main(String[] args) {
User student = new Student("小王", "20250101", "一年一班");
User teacher = new Teacher("李老师", "高级老师", "仨年一班");
Visitor principal = new Principal();
System.out.println("校长开始");
student.accept(principal);
teacher.accept(principal);
System.out.println("\n家长开始");
Visitor parent = new Parent();
student.accept(parent);
teacher.accept(parent);
}
}
所要被访问的类要向外提供一个接收访问对象的方法,然后通过创建目标对象,调用这个方法,并传入访问类的实现类