问题标签 [visitor-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1852 浏览

c++ - 访客模式+开放/封闭原则

是否可以实现尊重开放/封闭原则的访问者模式,但仍然能够添加新的可访问类?

开放/封闭原则指出“软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭”。

您可以实现任意数量的从 AbstractVisitor 派生的类:它对扩展开放。您不能添加新的可访问类,因为从 AbstractVisitor 派生的类将无法编译:它已关闭以供修改。

AbstractVisitor 类树遵循开放/封闭原则。AbstractVisitable 类树不遵守开放/封闭原则,因为它不能扩展。

除了如下扩展 AbstractVisitor 和 AbstractVisitable 之外,还有其他解决方案吗?

0 投票
5 回答
1870 浏览

java - 使用访问者模式和界面有什么区别?

将访问者设计模式应用于您的代码与以下方法有什么区别:

我假设通过使用接口,我们并没有真正分离算法。

0 投票
3 回答
2500 浏览

c++ - 单元测试访问者模式架构

我在我的一个应用程序中将访问者作为核心架构理念之一进行了介绍。我有几个访问者在相同的东西上进行操作。现在,我应该如何测试它?我正在考虑的一些测试比单元测试应该大一些(集成测试?无论如何),但我仍然想做。您将如何测试访问者模式上维基艺术中的 C++ 示例之类的代码

0 投票
20 回答
115442 浏览

design-patterns - 什么时候应该使用访问者设计模式?

我一直在博客中看到对访问者模式的引用,但我不得不承认,我就是不明白。我阅读了该模式的维基百科文章,并且了解它的机制,但我仍然对何时使用它感到困惑。

作为一个最近才真正获得装饰器模式并且现在在任何地方都看到它的用途的人,我希望能够真正直观地理解这个看似方便的模式。

0 投票
2 回答
163 浏览

c# - 我在哪里丢失了参考?

我正在尝试使用访客模式,我有以下内容:

访客 :

我打电话给访客的地方:

那么..我在哪里失去了参考?在 newItem = foundTag 之后 - 我希望在访问者的 foreach 中我会有新的价值 - 显然这不会发生。

编辑我想我找到了答案 - 在 foreach 中,变量是只读的。

http://discuss.joelonsoftware.com/default.asp?dotnet.12.521767.19

0 投票
1 回答
510 浏览

c# - 在 C# 中模拟 IDispatchEx

C# 3.0 扩展方法向基类型添加扩展,使得在该类型的所有实例上调用该方法都是合法的。

现在,我知道的 JavaScript 实现了 IDispatchEx,通过它可以将方法添加到特定实例。

那么如何将一组方法添加到 C# 类的“实例”中呢?我知道这是动态与静态语言的圣战领域。:) 让我澄清一下我的意图不是那样。

我只是希望能够根据实现该接口的类向接口添加一组事件。

我能够使用泛型做到这一点

然后我不喜欢SupportedEvents我想说

然后我认为 JavaScript(我知道C#不是JS:))... AND IDispatchEx, IL Weaving,Reflection.Emit等等等等,并认为可能有办法做到这一点... [设计时支持会很好,但我可以没有]

是的,我可能可以用访客模式来做这个“实例增强”。[不确定我是否可以得到合成糖]

评论?

0 投票
4 回答
1610 浏览

c# - Extending both sides of a Visitor/Bridge pattern

Say I have a hierarchy of classes, let's use the classic Shape examples:

abstract class Shape
Circle : Shape
Square : Shape

I have a second hierarchy of renderer classes that handle the rendering of shapes in different ways:

abstract class ShapeRenderer
HtmlShapeRenderer : ShapeRenderer
WindowsFormsShapeRenderer : ShapeRenderer

Allowing these to vary independently would traditionally involve using the Bridge pattern. Allowing the rendering actions to be extended without modifying the Shape classes would traditionally involve the Visitor pattern.

However, both of these focus exclusively on extending the implementation side and not the abstraction side. Say I wanted to add a new Shape, say Triangle - I want to be able to support rendering the Triangle as well. Since both the Visitor and the Bridge pattern rely on "flattening" the abstraction hierarchy into a set of methods, e.g.:

The only way to extend the Shape hierarchy is to modify the code of the base ShapeRenderer class, which is a breaking change.

Jon, to clarify: Using the Bridge or Visitor allows clients to provide alternative rendering implementations, but requires them to know about all potential Shapes. What I'd like to be able to do is allow clients to also be able to extend the Shape class and require them to provide a rendering implementation for their new class. This way, existing code can work with any type of Shape, without worrying about the particulars of rendering them.

Is there a common solution to this sort of problem usable in C#?

0 投票
5 回答
26922 浏览

design-patterns - 为什么要使用访客模式?

重复:我什么时候应该使用访客设计模式

为什么有人要使用访问者模式?我已经阅读了几篇文章,但我没有得到任何东西。

如果我需要一个功能来为自定义计费,我可以使用

或类似的东西

第二个不太复杂,Bill 函数仍然与 Customer 类分开。那么我为什么要使用访问者模式呢?

0 投票
7 回答
3100 浏览

java - Java:使用 RuntimeException 从访客中逃脱

我非常想在 Java 程序中使用未经检查的异常作为短路控制流结构。我希望这里有人可以建议我以更好,更清洁的方式来处理这个问题。

这个想法是我想缩短访问者对子树的递归探索,而不必在每个方法调用中检查“停止”标志。具体来说,我正在使用抽象语法树上的访问者构建控制流图。AST 中的一条return语句应该停止对子树的探索,并将访问者发送回最近的封闭 if/then 或循环块。

Visitor类(来自XTC 库)定义

通过形式的反射方法回调

dispatch没有声明抛出任何异常,所以我声明了一个扩展的私有类RuntimeException

现在,return 语句的访问者方法看起来像

每个复合语句都需要处理ReturnException

这一切都很好,除了:

  1. 我可能会忘记在ReturnException某个地方捕获,编译器不会警告我。
  2. 我觉得脏。

有一个更好的方法吗?是否有一种我不知道的 Java 模式来实现这种非本地控制流?

[更新] 这个特定的例子有些无效:Visitor超类捕获并包装异常(甚至RuntimeExceptions),所以抛出异常并没有真正的帮助。我已经实施了enumvisitReturnStatement. 幸运的是,这只需要在少数地方进行检查(例如,visitCompoundStatement),因此它实际上比抛出异常要少一些麻烦。

总的来说,我认为这仍然是一个有效的问题。虽然也许,如果您不依赖于第三方库,则可以通过明智的设计避免整个问题。

0 投票
1 回答
261 浏览

.net - 从复合控件获取数据 - 访问者模式?

我有一些相当复杂的表单,需要由网页设计师配置。

我一直在构建一些似乎正在完成这项工作的复合控件。

顶层控件只是一个容器,表单的各个部分都包含在其中。SubControls 实现通用接口,(即 NeptuneAddressControl 和 MarsAddressControl 实现 IPlanetaryAddressControl)

最终,一切都需要进入同一个数据库。

我不是将子控件的每个字段都公开为父控件中的道具,而是考虑实现一个跨越控件树的访问者,并填充一个实体对象,然后可以写入数据库。

这是正确的方法还是我离这里很远?