一、访问者模式介绍
二、代码演示
三、jdk中使用访问者模式的地方
一、 访问者模式介绍
核心:根据不同的访问者,对相同的数据产生不同的操作行为
定义:封装作用于某种数据结构(如List/Set/Map)中的各元素操作
可以在不改变各元素类的前提下,定义作用于这些元素的操作
类型:行为型
适用场景:
一个数据结构(如List/Set/Map)包含很多类型对象
数据结构与数据操作分离
优点:
增加新的操作很容易,即增加一个新的访问者
缺点:
增加新的数据结构困难
具体元素变更比较麻烦
相关设计模式:
访问者模式和迭代器模式
使用较少
二、代码演示
//课程抽象类
public abstract class Course {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void accept(Ivisitor ivisitor);
}
//免费课程
public class FreeCourse extends Course{
@Override
public void accept(Ivisitor ivisitor) {
ivisitor.visitor(this);
}
}
//收费课程
public class CodingCourse extends Course {
private int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public void accept(Ivisitor ivisitor) {
ivisitor.visitor(this);
}
}
//访问者接口
public interface Ivisitor {
void visitor(FreeCourse freeCourse);
void visitor(CodingCourse codingCourse);
}
//访问者接口实现
public class Visitor implements Ivisitor {
@Override
public void visitor(FreeCourse freeCourse) {
System.out.println("免费课程:"+freeCourse.getName());
}
@Override
public void visitor(CodingCourse codingCourse) {
System.out.println("实战课程:"+codingCourse.getName()+";价格是:"+codingCourse.getPrice()+"元");
}
}
//测试类
public class Test {
public static void main(String[] args) {
ArrayList<Course> courses = new ArrayList<>();
FreeCourse freeCourse=new FreeCourse();
freeCourse.setName("spring 设计模式");
CodingCourse codingCourse=new CodingCourse();
codingCourse.setName("收费版大数据课程");
codingCourse.setPrice(100);
courses.add(freeCourse);
courses.add(codingCourse);
//数据访问
for(Course course:courses){
course.accept(new Visitor());
}
}
}
看一下类的uml图:
执行结果:
三、jdk中使用访问者模式的地方
1、java.nio.file.FileVisitor
java.nio.file.SimpleFileVisitor
2、org.springframework.beans.factory.config.BeanDefinitionVisitor