问题标签 [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.
java - 使用访问者模式和界面有什么区别?
将访问者设计模式应用于您的代码与以下方法有什么区别:
我假设通过使用接口,我们并没有真正分离算法。
c++ - 单元测试访问者模式架构
我在我的一个应用程序中将访问者作为核心架构理念之一进行了介绍。我有几个访问者在相同的东西上进行操作。现在,我应该如何测试它?我正在考虑的一些测试比单元测试应该大一些(集成测试?无论如何),但我仍然想做。您将如何测试访问者模式上维基艺术中的 C++ 示例之类的代码
design-patterns - 什么时候应该使用访问者设计模式?
我一直在博客中看到对访问者模式的引用,但我不得不承认,我就是不明白。我阅读了该模式的维基百科文章,并且了解它的机制,但我仍然对何时使用它感到困惑。
作为一个最近才真正获得装饰器模式并且现在在任何地方都看到它的用途的人,我希望能够真正直观地理解这个看似方便的模式。
c# - 我在哪里丢失了参考?
我正在尝试使用访客模式,我有以下内容:
访客 :
我打电话给访客的地方:
那么..我在哪里失去了参考?在 newItem = foundTag 之后 - 我希望在访问者的 foreach 中我会有新的价值 - 显然这不会发生。
编辑我想我找到了答案 - 在 foreach 中,变量是只读的。
http://discuss.joelonsoftware.com/default.asp?dotnet.12.521767.19
c# - 在 C# 中模拟 IDispatchEx
C# 3.0 扩展方法向基类型添加扩展,使得在该类型的所有实例上调用该方法都是合法的。
现在,我知道的 JavaScript 实现了 IDispatchEx,通过它可以将方法添加到特定实例。
那么如何将一组方法添加到 C# 类的“实例”中呢?我知道这是动态与静态语言的圣战领域。:) 让我澄清一下我的意图不是那样。
我只是希望能够根据实现该接口的类向接口添加一组事件。
我能够使用泛型做到这一点
然后我不喜欢SupportedEvents
我想说
然后我认为 JavaScript(我知道C#
不是JS
:))... AND IDispatchEx
, IL Weaving
,Reflection.Emit
等等等等,并认为可能有办法做到这一点... [设计时支持会很好,但我可以没有]
是的,我可能可以用访客模式来做这个“实例增强”。[不确定我是否可以得到合成糖]
评论?
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#?
design-patterns - 为什么要使用访客模式?
为什么有人要使用访问者模式?我已经阅读了几篇文章,但我没有得到任何东西。
如果我需要一个功能来为自定义计费,我可以使用
或类似的东西
第二个不太复杂,Bill 函数仍然与 Customer 类分开。那么我为什么要使用访问者模式呢?
java - Java:使用 RuntimeException 从访客中逃脱
我非常想在 Java 程序中使用未经检查的异常作为短路控制流结构。我希望这里有人可以建议我以更好,更清洁的方式来处理这个问题。
这个想法是我想缩短访问者对子树的递归探索,而不必在每个方法调用中检查“停止”标志。具体来说,我正在使用抽象语法树上的访问者构建控制流图。AST 中的一条return
语句应该停止对子树的探索,并将访问者发送回最近的封闭 if/then 或循环块。
超Visitor
类(来自XTC 库)定义
通过形式的反射方法回调
dispatch
没有声明抛出任何异常,所以我声明了一个扩展的私有类RuntimeException
现在,return 语句的访问者方法看起来像
每个复合语句都需要处理ReturnException
这一切都很好,除了:
- 我可能会忘记在
ReturnException
某个地方捕获,编译器不会警告我。 - 我觉得脏。
有一个更好的方法吗?是否有一种我不知道的 Java 模式来实现这种非本地控制流?
[更新] 这个特定的例子有些无效:Visitor
超类捕获并包装异常(甚至RuntimeException
s),所以抛出异常并没有真正的帮助。我已经实施了enum
从visitReturnStatement
. 幸运的是,这只需要在少数地方进行检查(例如,visitCompoundStatement
),因此它实际上比抛出异常要少一些麻烦。
总的来说,我认为这仍然是一个有效的问题。虽然也许,如果您不依赖于第三方库,则可以通过明智的设计避免整个问题。
.net - 从复合控件获取数据 - 访问者模式?
我有一些相当复杂的表单,需要由网页设计师配置。
我一直在构建一些似乎正在完成这项工作的复合控件。
顶层控件只是一个容器,表单的各个部分都包含在其中。SubControls 实现通用接口,(即 NeptuneAddressControl 和 MarsAddressControl 实现 IPlanetaryAddressControl)
最终,一切都需要进入同一个数据库。
我不是将子控件的每个字段都公开为父控件中的道具,而是考虑实现一个跨越控件树的访问者,并填充一个实体对象,然后可以写入数据库。
这是正确的方法还是我离这里很远?