设计模式-访问者模式
一.所用到的类
访问者模式是一个多对多的关系
1.所要被访问的类
一个公共抽象类:属性和accept方法,用来接收访问者
实现抽象类的N个类
2.访问者类
一个抽象接口 里面定义要访问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);
}
所要被访问的类1
public class Student extends User{public Student(String name, String identity, String clazz){super(name, identity, clazz);}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}
所要被访问的类2
public class Teacher extends User{public Teacher(String name, String identity, String clazz) {super(name, identity, clazz);}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}
访问类的接口
public interface Visitor {public void visit(Student student);public void visit(Teacher teacher);
}
访问类的实现类1
public class Parent implements Visitor{@Overridepublic void visit(Student student) {System.out.println("学生" + student.name + ",老师" + student.clazz );}@Overridepublic void visit(Teacher teacher) {System.out.println("老师" + teacher.name + ",身份" + teacher.clazz );}
}
访问类的实现类2
public class Principal implements Visitor{@Overridepublic void visit(Student student) {System.out.println("学生" + student.name + "的学号是:" + student.identity);}@Overridepublic 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);}
}
三、结果
四、总结
所要被访问的类要向外提供一个接收访问对象的方法,然后通过创建目标对象,调用这个方法,并传入访问类的实现类