定义
封装作用于某数据结构(如list、set、map等)中的各元素的操作
可以在不改变各元素的类的前提下,定义作用于这些元素的操作
类型
行为型
优点
增加新的操作很容易,即增加一个新的访问者
缺点
增加新的数据结构比较困难
具体元素变更比较麻烦
相关设计模式
访问者模式和迭代器模式
coding
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 visitor);
}
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 visitor) {
visitor.visit(this);
}
}
public class FreeCourse extends Course {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
public interface IVisitor {
void visit(CodingCourse codingCourse);
void visit(FreeCourse freeCourse);
}
public class Visitor implements IVisitor {
@Override
public void visit(CodingCourse codingCourse) {
System.out.println("实战课程:" + codingCourse.getName() + " 价格:" + codingCourse.getPrice());
}
@Override
public void visit(FreeCourse freeCourse) {
System.out.println("免费课程:" + freeCourse.getName());
}
}
public class Test {
public static void main(String[] args) {
List<Course> courseList = new ArrayList<>();
FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("SpringMVC数据绑定 免费课程");
CodingCourse codingCourse = new CodingCourse();
codingCourse.setName("java设计模式精讲");
codingCourse.setPrice(299);
courseList.add(freeCourse);
courseList.add(codingCourse);
for (Course course : courseList) {
course.accept(new Visitor());
}
}
}
源码解析
1、java.nio.file.FileVisitor
2、org.springframework.beans.factory.config.BeanDefinitionVisitor