- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种简洁的设计来模拟 Visitor 的功能,而没有它的许多缺点。在 Java 中,传统的实现(如 GoF 中所述)采用双重分派(dispatch)来摆脱 if-elses。为了解决这个问题,我看到了一些使用反射来避免修改“可见”类的实现,但这些实现在查找方法名称时依赖于硬编码字符串。虽然很有用,但我仍然认为它们不是干净的设计。
是否可以使用数据结构和/或良好的 OO 设计来模拟相同的想法?它不一定是一种模式,我只是在寻找解决类似问题的示例(例如:使用 Map<Class<T>,SomeFunctionObject>
)。
更新像这样的东西:
public abstract class BaseVisitor<T> {
private final TypesafeHeterogeneusMap map;
protected BaseVisitor(){
map = inflateFunctions();
}
public <E extends T> void process(E element){
if(element == null){
throw new NullPointerException();
}
boolean processed = false;
@SuppressWarnings("unchecked")
Class<? super T> sc = (Class<? super T>) element.getClass();
while(true){
if(sc != null){
FunctionObject<? super T> fo2 = map.get(sc);
if(fo2 != null){
fo2.process(element);
processed = true;
break;
}
sc = sc.getSuperclass();
} else {
break;
}
}
if(!processed) System.out.println("Unknown type: " + element.getClass().getName());
}
abstract TypesafeHeterogeneusMap inflateFunctions();
}
我认为实际上是模板模式和命令模式的混合体。请随时发表有关如何改进它的建议。
最佳答案
您可以让所有的 Visitor 实现扩展一个基类,它为每种类型的 Visitable 提供默认实现:
public interface AnimalVisitor {
void visitHorse(Horse horse);
void visitDog(Dog dog);
}
public class BaseAnimalVisitor implements AnimalVisitor {
public void visitHorse(Horse horse) {
// do nothing by default
}
public void visitDog(Dog dog) {
// do nothing by default
}
}
然后,当引入一个新的类Cat
时,你在接口(interface)和基类中添加visitCat(Cat cat)
方法,剩下所有的访问者不变,仍然编译。如果他们不想忽略猫,那么您可以覆盖 visitCat
方法。
关于java - 设计模拟 Visitor 而没有其缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836516/
在维基百科中 sample在 GoF 书中,访问者模式的使用是通过调用某些接受器上的 accept 方法开始的。但是为什么会这样呢?为什么我们不能以所需的接受器作为参数开始调用 visit 方法?我们
我正在尝试制作antrl4 4.6。工作,但我收到 4 个高级错误,我无法解决它们。有人可以帮我吗?也许需要匿名类。 还有 super() 错误,我将它放在正确的位置,但它拒绝工作。 Yoco.jav
跟踪特定页面的页面浏览量(特别是独特的)的最佳方法是什么? 示例:论坛中的话题、视频网站中的视频、问答脚本 (SO) 中的问题。 目前,我正在尝试为每一行采用一个简单的“浏览量”列来计算浏览量,但是,
在我对 Rust 的有限理解中,我认为 trait 就像接口(interface)——当你实现一个接口(interface)时,你需要实现所有的方法。 我现在正在编写自定义 serde::Deseri
我正在做一个关于访问者设计模式的演示,我了解它是如何工作的,但我还没有找到“定义的”优点和缺点,而且我不想自己推测优点或缺点,因为我可以设置虚假信息。 最佳答案 以下是我对 Visitor 的一些想法
我正在做一个关于访问者设计模式的演示,我了解它是如何工作的,但我还没有找到“定义的”优点和缺点,而且我不想自己推测优点或缺点,因为我可以设置虚假信息。 最佳答案 以下是我对 Visitor 的一些想法
访问者模式表示一个作用于某对象结构中各元素的操作。它可以在不修改各元素类的前提下定义作用于这些元素的新操作,即动态的增加具体访问者角色。 访问者模式利用了双重分派。先将访问者传入元素对象的Accep
代码如下: <?php /** * 访问者模式 * * 表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这
访问者模式(Visitor Pattern)使用了一个访问者类,它改变了元素类的执行算法,通过这种方式,元素的执行算法可以随着访问者改变而改变 访问者模式中,元素对象已接受访问者对象,这样访问者对象
我尝试使用三种不同的方法提取特定目录的(唯一)访问者计数: * 有简介 * 使用动态高级段 * 使用自定义报告过滤器 在较小的站点上,这三种方法给出相同的结果。但是在大型网站(> 500 万次访问/月
我使用 boost::variant 制作了一个程序,但不知何故 const 不正确。 错误:将“const CompareTitle”作为“bool CompareTitle::operator()
我正在开发一个应用程序的设计,我想我可能会应用某种 Visitor design pattern ,但事实证明这并不是我要找的。也许有人可以指出我在这种情况下需要的变体? 我的大部分代码都有一个模板参
我正在寻找一种简洁的设计来模拟 Visitor 的功能,而没有它的许多缺点。在 Java 中,传统的实现(如 GoF 中所述)采用双重分派(dispatch)来摆脱 if-elses。为了解决这个问题
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在尝试编写一个简单的脚本系统(用于视频游戏),其中没有非常复杂的任务,只有简单的 bool 检查和操作集。 我是一名学生,但我不是在学习编程,我只是把它作为一种爱好,所以我正在学习基础知识,最近我
我使用类似 STL 的迭代器在 C++ 中实现了访问者模式,用于存储访问者在容器中的当前位置。现在我想在迭代容器时更改容器,我特别感兴趣的是从容器中删除项目,即使是我当前正在访问的项目。 现在显然这将
我正在尝试以参数化方式实现访问者模式的修改版本,以这种方式避免“通用访问者”对每个具体元素都有过载,但是,由于我没有太多经验在模板编程中,我不知道如何完成“模式”。 代码: // test.cpp #
我没有看到有效的示例,而且我看到一些拉取请求仍处于打开状态。我想避免沿着花园小径走。 https://github.com/antlr/antlr4/pull/1807 https://github.
双重分发(double dispatch) 什么是双重分发? 谈起面向对象的程序设计时,常说起的面向对象的「多态」,其中关于多态,经常有一个说法是「父类引用指向子类对象」。 这种父类的引用指向
本文整理了Java中org.raml.parser.visitor.YamlValidator类的一些代码示例,展示了YamlValidator类的具体用法。这些代码示例主要来源于Github/Sta
我是一名优秀的程序员,十分优秀!