大话设计模式——22.访问者模式(Visitor Pattern)

简介

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

UML图

在这里插入图片描述

应用场景
  • 适用于数据结构相对稳定且算法易于变化的系统,该模式将数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化
  • 增加新的操作较容易

示例

  1. Visitor:
public abstract class Action {


    /**
     * 男人的结论
     *
     * @param man
     */
    public abstract void manConclusion(Man man);

    /**
     * 女人的结论
     *
     * @param woman
     */
    public abstract void womanConclusion(Woman woman);
}
public class Success extends Action {

    @Override
    public void manConclusion(Man man) {
        System.out.println("背后有个强大的女人!");
    }

    @Override
    public void womanConclusion(Woman woman) {
        System.out.println("个人素质优秀!");
    }
}
  1. Element:
public abstract class People {


    /**
     * 男女态度
     *
     * @param visitor
     */
    public abstract void accept(Action visitor);
}
public class Man extends People {

    @Override
    public void accept(Action visitor) {
        visitor.manConclusion(this);
    }
}
public class Woman extends People {

    @Override
    public void accept(Action visitor) {
        visitor.womanConclusion(this);
    }
}
  1. ObjectStructure:
public class ObjectStructure {

    private final List<People> peopleList = new ArrayList<>();

    /**
     * 添加
     *
     * @param people
     */
    public void add(People people) {
        peopleList.add(people);
    }

    /**
     * 删除
     *
     * @param people
     */
    public void remove(People people) {
        peopleList.remove(people);
    }

    /**
     * 结果展示
     */
    public void display(Action visitor) {
        for (People p :
                peopleList) {
            p.accept(visitor);
        }
    }
}
  1. 运行
public class Main {

    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(new Woman());
        objectStructure.add(new Man());

        Success success = new Success();
        objectStructure.display(success);
    }
}

在这里插入图片描述

总结

  • 优点

    • 满足开闭原则,新增操作只需新增访问类即可
  • 缺点

    • 增加新的数据结构会变得困难

相关推荐

  1. 访问模式(大话设计模式)C/C++版本

    2024-04-13 19:00:05       19 阅读
  2. 设计模式: 行为型之访问模式(22)

    2024-04-13 19:00:05       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 19:00:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 19:00:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 19:00:05       82 阅读
  4. Python语言-面向对象

    2024-04-13 19:00:05       91 阅读

热门阅读

  1. Docker之数据卷和Dockerfile

    2024-04-13 19:00:05       36 阅读
  2. C#实现HTTP上传文件的方法

    2024-04-13 19:00:05       43 阅读
  3. jieba分词的应用

    2024-04-13 19:00:05       40 阅读
  4. 04-springmvc-RequestContextHolder

    2024-04-13 19:00:05       42 阅读
  5. 数据仓库理论与实战

    2024-04-13 19:00:05       35 阅读
  6. 个人博客项目_09

    2024-04-13 19:00:05       33 阅读
  7. FNP preptool has not been run on this executable

    2024-04-13 19:00:05       33 阅读
  8. C#入门理解设计模式的6大原则

    2024-04-13 19:00:05       37 阅读
  9. Redux状态管理原理与Redux Toolkit使用教程

    2024-04-13 19:00:05       39 阅读
  10. docker ruoyi 部署

    2024-04-13 19:00:05       38 阅读
  11. 如何用composer来安装和配置LAMP环境?

    2024-04-13 19:00:05       37 阅读
  12. NSG4427 /IR4427 双通道 2A 超高速功率开关驱动器

    2024-04-13 19:00:05       33 阅读