1️⃣概念
定义 : 封装作用于某种数据结构(如List / Set / Map等)中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的操作;
类型 : 行为型
2️⃣适用场景
一个数据结构(如List / Set / Map等)包含很多类型对象;
数据结构与数据操作分离;
3️⃣优点
增加新的操作将会非常容易,只要增加一个新的访问者就可以了;
4️⃣缺点
增加新的数据结构会比较困难;
具体元素的变更会比较麻烦;
5️⃣访问者模式Coding
1 创建抽象类Course
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);
}
2 创建FreeCourse继承Course
public class FreeCourse extends Course {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
3 创建CodingCourse继承Course
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);
}
}
4 创建IVisitor接口
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(CodingCourse codingCourse);
}
5 创建Visitor实现IVisitor
public class Visitor implements IVisitor {
//访问免费课程,打印所有免费课程名称
@Override
public void visit(FreeCourse freeCourse) {
System.out.println("免费课程:"+freeCourse.getName());
}
//访问实战课程,打印所有实战课程名称及价格
@Override
public void visit(CodingCourse codingCourse) {
System.out.println("实战课程:"+codingCourse.getName()+" 价格:"+codingCourse.getPrice()+"元");
}
}
6 UML类图
7 编写测试类
public class Test {
public static void main(String[] args) {
List<Course> courseList = new ArrayList<Course>();
FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("SpringMVC数据绑定");
CodingCourse codingCourse = new CodingCourse();
codingCourse.setName("Java设计模式精讲 -- By Geely");
codingCourse.setPrice(299);
courseList.add(freeCourse);
courseList.add(codingCourse);
for(Course course : courseList){
course.accept(new Visitor());
}
}
}
6️⃣访问者模式源码解析
java.nio.FileVisitor SimpleFileVisitor
Spring : BeanDefinitionVisitor StringValueResolver
网友评论