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

简介

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

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

示例

  1. Visitor:
java 复制代码
public abstract class Action {


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

    /**
     * 女人的结论
     *
     * @param woman
     */
    public abstract void womanConclusion(Woman woman);
}
java 复制代码
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:
java 复制代码
public abstract class People {


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

    @Override
    public void accept(Action visitor) {
        visitor.manConclusion(this);
    }
}
java 复制代码
public class Woman extends People {

    @Override
    public void accept(Action visitor) {
        visitor.womanConclusion(this);
    }
}
  1. ObjectStructure:
java 复制代码
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. 运行
java 复制代码
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);
    }
}

总结

  • 优点

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

    • 增加新的数据结构会变得困难
相关推荐
Java后端的Ai之路5 分钟前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData34 分钟前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat42 分钟前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰44 分钟前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang1 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞1 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长1 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
雪芽蓝域zzs2 小时前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea
golang学习记2 小时前
IDEA 开始换芯,发布全新AI版终端
java·人工智能·intellij-idea
vipxieliang2 小时前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端