design-patterns - 访问者模式的常见用例是什么?
问题描述
我正在寻找访问者模式的常见用例。我可以在互联网上找到一些示例,但它们相当基本,仅解释概念,而不是当这种模式可以真正节省您的时间/生命时。
您是否有使用这种模式的真实示例?(例如,在 Github 中现有的 java 项目中)
我看不清楚它大规模解决了什么问题以及为什么开发人员可以使用它?
解决方案
当您想向对象发送消息(即调用方法)时,访问者模式很有用,但由于编译器的类型检查而不能。例如,该对象被声明属于Animal
只有方法的类型(接口) say()
,并且您想smile()
在该对象上调用方法。
是的,您可以修改接口Animal
(添加方法smile()
),但出于某种原因,您希望保持接口稳定。如果将来您需要更多方法go()
,例如walk()
...?
是的,您可以将Animal
对象转换为您想要的每种特定类型,例如Dog
,Cat
...但是出于某种原因,您希望在不关心特定动物类型方面保持此调用代码的稳定性。如果将来你有更多的动物类型Bird
,比如Elephant
……?毕竟,调用代码只是想让对象微笑,不想在有新的特定类型的对象时被修改。
所以,让我们将所有这些不稳定的事情委托给访问者。您将拥有SmileVisitor
, GoVisitor
, WalkVisitor
... 的方法visit(Dog)
, visit(Cat)
... 并像这样使用它们:
new SmileVisitor().visit(animal);
P/S:我认为您可以找到一些常见的用例,让您自己保持源代码的某些部分稳定。
推荐阅读
- c# - 在 C# 中创建泛型函数以将数组转换为字典
- java - Spring Boot 请求:“在启用 'debug' 的情况下重新运行您的应用程序” - 我该怎么做?
- angular - Angular:从静态变量访问@ngx-translate/core
- ios - 如何从 Model > NSDictionary 获取值并解析到另一个视图控制器?
- django - TemplateDoesNotExist,注册/login.html Django
- c# - 将用户控制面板操作到 Windows From 的推荐方法
- java - 确定印度拉米牌是否是赢牌 - Java
- c - C 中 Node->next!=NULL 和 Node!=NULL 之间的区别
- r - 树状图与 dendextend::tanglegram 的比较 - 不正确的颜色分配?
- r - 在同一个图上使用环境中的数据绘制多个时间序列