一、定义与类型:
》定义:封装作用于某数据结构(如List/Set/Map等)中的各元素的操作
》可以在不改变各元素的类的前提下,定义作用于这些元素的操作。
》使用概率较低
》类型:行为型
二、适用场景:
》一个数据结构如(List/Set/Map等)包含很多类型对象;
》数据结构与数据操作分离。数据是数据,对数据的操作是对数据的操作这种分离的场合时,
比如数据加载和对数据的操作分类时可以考虑。
三、优点:
》增加新的操作很容易,即增加一个新的访问者。
四、缺点:
》增加新的数据结构困难;
》具体元素变更比较麻烦。若在被访问的对象中增加属性或方法等,访问者都需要变更。
五、相关设计模式:,
》访问者模式和迭代器模式:
共同点:都是在某种数据结构上进行处理;
差异:访问者模式主要是对保存在数据结构中的元素进行某种处理。
迭代器模式主要是对保存在数据结构中的元素进行遍历,
六、代码实践:
package pattern.behaviral.visitor;
/**
* Created by Administrator on 2019/9/1.
*/
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);
}
package pattern.behaviral.visitor;
/**
* Created by Administrator on 2019/9/1.
*/
public class FreeCourse extends Course{
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
package pattern.behaviral.visitor;
/**
* Created by Administrator on 2019/9/1.
*/
public class CodingCourse extends Course {
private int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
package pattern.behaviral.visitor;
/**
* Created by Administrator on 2019/9/1.
*/
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(CodingCourse codingCourse);
}
package pattern.behaviral.visitor;
/**
* Created by Administrator on 2019/9/1.
* 该访问者只是个普通点的访问者,如果是特殊的,比如网站
* 课程老板,可能还想要看到更多的信息,则可以通过创建
* 另外的访问者类型
*/
public class Visitor implements IVisitor {
//访问免费课程,打印所有免费课程名称
public void visit(FreeCourse freeCourse) {
System.out.println("免费课程:"+freeCourse.getName());
}
//访问实战课程,打印素有实战课程名称及价格
public void visit(CodingCourse codingCourse) {
System.out.println("实战课程:"+codingCourse.getName()+",价值"+codingCourse.getPrice()+"元");
}
}
package pattern.behaviral.visitor;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2019/9/1.
*/
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.setPrice(299);
codingCourse.setName("java实战课程");
courseList.add(freeCourse);
courseList.add(codingCourse);
for (Course course : courseList){
course.accept(new Visitor());
}
}
}
七、源码解读:
jdk包中nio 包下 :FileVisitor 接口相关的 ,它的实现类SimpleFileVisitor
Spring中的BeanDefinitionVisitor 为各种Bean 的配置进行了访问操作
visitBeanDefinition 主要用于分解各种Bean中的数据