访问者模式

1、访问者模式介绍

一、定义与类型

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

二、适用场景

一个数据结构如(List/Set/Map等)包含不少类型对象
数据结构与数据操做分离设计模式

三、优势

增长新的操做很容易,即增长一个新的访问者数据结构

四、缺点

具体元素变动比较麻烦ide

五、相关设计模式

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

2、代码示例

模拟场景:针对免费课程和实战课程,访问者作出不一样的行为this

课程抽象类:设计

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(免费课程):code

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

访问者接口:blog

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

3、源码示例

一、Jdk中的FileVisitor

二、Spring中的BeanDefinitionVisitor

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息