访问者模式

一、访问者模式介绍

1、定义与类型

封装作用于某数据结构(如List/Set/Map等)中的各元素的操作
可以在不改变各元素的类的前提下,定义作用于这些元素的操作
类型:行为型

2、适用场景

一个数据结构如(List/Set/Map等)包含很多类型对象
数据结构与数据操作分离

3、优点

增加新的操作很容易,即增加一个新的访问者

4、缺点

具体元素变更比较麻烦

5、相关设计模式

访问者模式和迭代器模式
共同点:都是在某种数据结构上进行处理,例如List、Map、Set
访问者模式主要用于 对保存在数据结构中的元素进行某种特定的处理
迭代器模式主要用于 逐个遍历保存在数据结构中的元素

二、代码示例

模拟场景:针对免费课程和实战课程,访问者做出不同的行为

课程抽象类:

public abstract class Course {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public abstract void accept(IVisitor visitor);
}

课程实现类1(免费课程):

public class FreeCourse extends Course {
    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

课程实现类2(实战课程):

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 interface IVisitor {
    void visit(FreeCourse freeCourse);
    void visit(CodingCourse codingCourse);
}

访问者实现类:

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()) ;
    }
}

测试类:

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("访问者模式讲解");
        codingCourse.setPrice(99);

        courseList.add(freeCourse);
        courseList.add(codingCourse);

        for (Course course : courseList) {
            course.accept(new Visitor());
        }
    }
}

输出:
免费课程 : SpringMVC
实战课程 : 访问者模式讲解,价格 : 99

三、源码示例

1、Jdk中的FileVisitor

2、Spring中的BeanDefinitionVisitor

原文地址:https://www.cnblogs.com/weixk/p/13632514.html