问题标签 [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.
php - 您如何将访问者分隔到两个介绍页面以比较每个访问者的注册量?
我正在制作一个依赖用户注册才能玩我的在线游戏的网站。如果他们不登录,他们只会看到介绍页面。
如果用户登录到该站点,我会将这些信息保存到 cookie 中,以便下次他们访问时,它们将直接发送到 login.php。如果用户在 cookie 中没有这些信息,它们将被发送到 intro.php。
当然,我希望尽可能多的用户注册(或者在这种情况下,尽可能高的百分比)。为此,我想将 50% 的用户分配给 intro1.php,将另外 50% 的用户分配给 intro2.php。然后我想比较点击registration.php链接的用户数量/百分比以及点击远离网站的用户数量。
我想统计一下从intro1.php 到registration.php 的访问者的确切百分比,以及从intro2.php 到registration.php 的确切百分比。这样我可以比较我的 intro1.php 和 intro2.php 的成功率并改进我的介绍页面。我怎样才能做到这一点?
java - Java 对象图访问者库
你知道一个好的java对象图访问者库吗?
我想访问一个对象及其子组件,并在某些条件匹配时执行一些操作。
示例用法:
- 在一个巨大的域对象图上,将每个 id 重置为
null
- 在一个巨大的域对象图上,
Set
用一个TreeSet
包含相同元素的实例替换每个对象。
我想要一个库,而不是自定义代码,因为遍历对象图可能很棘手。您必须处理集合、数组、代理等...我曾考虑重用 XStream 的一部分来实现这一点,但看起来并不那么容易:Xstream 访问者更面向对象转换而不是对象自我修改。
java - 关于java中虚方法的问题
简而言之:我希望以下代码打印“sub”:
而且我不想更改打印(元素 e)。所以没有什么像
我想做的是
自动将其转换为真正的子类并强制系统输入 print(SubElement e)。这有可能吗?
c# - 访问者模式是将域枚举重构为类的最佳方式吗?
如果我们想将枚举(包含在域层中)重构为多态类,那么使用“简单”抽象方法可能不是一个好主意,如果我们想要重构的所有 switch 和 if 语句都在其他层内(如业务或表示层),因为我们最终可能会在领域层中引用这些层:
(在上面的例子中,我们也可以有一个“交叉引用”的问题)
我发现访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern)是解决这个问题的有效方法:在域层中,我们只定义 MyRefactoredEnum.IVisitor 接口,所有其他层都可以实现自己的访问者。
唯一的问题:当我们修改 MyRefactoredEnum.IVisitor 接口时(例如,因为我们添加了另一个 MyRefactoredEnum 的子类),我们必须修改并重新编译所有引用域模型的项目和解决方案。我们可以使用反射( http://surguy.net/articles/visitor-with-reflection.xml )解决问题,但它可能会很慢......
是否有更好的模式来重构枚举?
PS:对不起我糟糕的英语:)
php - 在聚合对象上实现访问者模式
我正在努力将访问者模式应用于一些具有标量成员并同时聚合成员(集合)的对象。
这些是我拥有的对象:
如您所见,该结构也将是递归的,但这是我以后关心的问题。;-)
我的问题是:实现访问者模式的最佳方式是什么,它允许我访问对象以及它们的可访问子项(集合)。
我想创建一个这样的界面:
然后让 Artist 和 WorkOfArt 都像这样扩展一个抽象类:
最终目标是最终得到一个具体的访问者,它将写出一个类似于以下内容的 XML 文件:
请指教:我在这里的方向正确吗?因为getVisitableChildren()
界面对我来说有点古怪。我是否应该完全放弃访问者模式并采取不同的方法?
谢谢。
c++ - 访问者模式是区分 C++ 中参数类型的最快方法吗?
访问者模式是在 C++ 中完成方法参数类型识别(有效地单次调度参数,而不是成员的类)的最快方法吗?我可能知道我想对未知子类型的元素调用的确切方法,因此总是不希望像V::visit(A *)
in那样进行额外的虚拟方法调用A::accept(V &v) { v.visit(this); }
。
我想要以下功能等效的东西,但成本为 O(1),这是 AFAIK 无法使用 dynamic_cast<> 或 typeid() 梯子,因为std::type_info
不能是 constexpr/switchable。
我在这里有什么选择?感谢您的建议!
编辑:更改了示例代码以通过字段提供结果,这样不同的方法类型就不需要多个签名。谢谢,莫里斯!
最终决定:除了不喜欢访问者模式的强制双重调度成本之外,我还想避免接口膨胀的重载foo()
,但我认为没有已知的干净模式可以做到这一点。我最终只是做了直接的静态重载,然后就收工了。无论如何,我想将重载封装在一个函数中可能充其量是一个值得商榷的目标。谢谢,莫里斯的回应。
c++ - C++ 模板元编程从 shared_ptr 和 boost::static_visitor 创建 boost::variant
作为个人练习,我想使用 shared_ptr 实现访问者模式。我熟悉 Robert Martin 的非循环访问者论文,但发现虚拟 accept() 的侵入性以及为每个 {X} 类创建 {X}Visitor 类的必要性令人不快。我喜欢 boost::static_visitor 类,因为它在本地封装了所有逻辑,而无需 {X}::accept() 和 {X}Visitor。
我正在寻找的是关于如何创建我在下面提到的模板函数函数rip的提示(正如我所说,我正在这样做作为练习)。我认为它应该是以下形式:
任何提示或指向做类似事情的教程将不胜感激。谢谢。
design-patterns - 使用访问者设计模式的充分理由?
在你告诉我已经有一个类似的问题之前,是的,我知道,我已经读过了。但是那里的问题集中在什么时候,我对为什么感兴趣。
我明白事情是如何运作的。经典的动物、狗、猫的例子总是很有魅力。
问题是这段代码
对我来说似乎很不自然。为什么?
我的意思是,是的,这样我的 Dog 和 Cat 模型就没有区别了(顺便说一句,我第一次在英语中使用这个词),因为真正的实现隐藏在 Sound 类下,但这不仅仅是一种压低代码的方法? 多态性还不足以做这样的事情吗?
对我而言,不同之处在于,使用多态性,您必须编辑每个类(但模型保持不变,对吗?),而您只需使用访问者设计模式编辑一个类。
oop - 基于组件的游戏引擎设计中的事件处理
我想这个问题或它的变体得到了很多传播,所以如果我说的是重复的,而答案在别处,请通知我。
我一直在研究游戏引擎设计,并遇到过基于组件的实体模型。这听起来很有希望,但我仍在研究它的实施。
我正在考虑一个系统,其中引擎由几个“子系统”组成,这些“子系统”管理某些方面,如渲染、声音、健康、人工智能等。每个子系统都有一个与之关联的组件类型,比如健康的健康组件子系统。一个“实体”,例如一个 NPC、一扇门、一些视觉效果或玩家,简单地由一个或多个组件组成,当它们一起赋予实体其功能时。
我确定了四个主要的信息传递渠道:一个组件可以广播到其当前实体中的所有组件,一个组件可以广播到它的子系统,一个子系统可以广播到它的组件,一个子系统可以广播到其他子系统。
例如,如果用户想要移动他们的角色,他们会按下一个键。这个按键将被输入子系统拾取,然后广播事件并被播放器子系统拾取。播放器子系统然后将此事件发送到所有播放器组件(以及这些组件组成的实体),并且这些播放器组件将与其自身实体的位置组件通信以继续移动。
按键操作的所有这些似乎有点啰嗦,我当然愿意改进这个架构。但无论如何,我的主要问题仍然存在。
至于事件本身,我考虑了事件在访问者模式中的行为。我想要的重要性在于,如果事件遇到它不支持的组件(因为在移动事件中与 AI 或健康没有直接关系),它将忽略该组件。如果一个事件没有找到它所追求的组件,那也没关系。
访问者模式几乎可以工作。但是,它要求我对每种类型的组件(即 visitHealthComponent、visitPositionComponent 等)都有虚函数,即使它与它们没有任何关系。我可以将这些函数留空(因此,如果确实遇到了这些组件,它将被忽略),但是每次添加组件时我都必须添加另一个函数。
我的希望是我能够添加一个组件而不必在其他地方添加东西,并且添加一个事件而不会弄乱其他东西。
所以,我的两个问题:
- 在效率、灵活性等方面,我的设计是否可以进行任何改进?
- 处理事件的最佳方式是什么?
c++ - 我的组件需要访问者吗?
我正在尝试用 C++(使用 SDL)做一个小而简单的 GUI。我正在尝试使用复合模式以获得灵活的解决方案。
我有一个 Widget 类,带有 Component 对象:例如,有一个 PaintingComponent ;如果我想画一个盒子,我将使用从 PaintingComponent 继承的 PaintingBoxComponent。
理想的 Widget 类看起来有点像:
我的问题很简单:当我需要它时激活这个组件的最佳方式是什么?
我首先在 Widget 类中使用了“显示”功能。但我看到两个问题:
1°)我失去了小部件中“组件”的纯多态性,因为我被迫将小部件的特定组件声明为绘画组件。我可以处理这个问题,因为应该显示一个小部件是合乎逻辑的。
2°)比较麻烦,我需要在我的主程序和我的绘画组件之间传递信息。要么我将 SDL_Surface* 屏幕传递给 PaintingComponent,然后它绘制它在其上绘制的图像,要么我给我的组件一个对需要接收它绘制的图像的对象的引用(并且这个对象将在其上绘制图像屏幕)。在这两种情况下,Widget 都必须处理数据,并且必须知道 SDL_Surface* 是什么。我正在失去松散耦合,我不希望这样。
然后,我考虑使用“访客”模式,但我不习惯它,在我尝试实现它之前,我想听听你的建议。
在这种情况下,您将如何着手制定灵活而可靠的解决方案?提前致谢 !