C++ Can';t找出正确的方法(模式…)

C++ Can';t找出正确的方法(模式…),c++,oop,design-patterns,C++,Oop,Design Patterns,我有一个问题,我很难找到最佳的解决方法。 一位同事推荐了访问者模式,但我不确定是否可以使用访问者实现我想要的功能。即使可以做到这一点,如果我使用这种方法,也会有一些关于清晰度的严重问题 我正在尝试序列化/反序列化设置,并发现我需要将相同的helper方法添加到许多类中(错误)。我更愿意将这些助手从我要放入的类中移出(这些类不应该有处理序列化/反序列化的代码,但不确定如何将其排除),放到一个集中的位置 目前,我正在尝试获取/设置父菜单类中包含的对象(按钮、其他菜单组件等)的参数。实际上,我不希望这

我有一个问题,我很难找到最佳的解决方法。 一位同事推荐了访问者模式,但我不确定是否可以使用访问者实现我想要的功能。即使可以做到这一点,如果我使用这种方法,也会有一些关于清晰度的严重问题

我正在尝试序列化/反序列化设置,并发现我需要将相同的helper方法添加到许多类中(错误)。我更愿意将这些助手从我要放入的类中移出(这些类不应该有处理序列化/反序列化的代码,但不确定如何将其排除),放到一个集中的位置

目前,我正在尝试获取/设置父菜单类中包含的对象(按钮、其他菜单组件等)的参数。实际上,我不希望这些父类具有帮助器方法(因为这会导致父类之间的代码重复,并且父类不应该“关心”或“知道”这些序列化/反序列化细节)

当然,最简单的方法是让集中式方法使用“void*”指针。这篇文章很容易阅读,但(由于“void*”)有点脏。“void*”将是对我需要处理的每个父类(菜单)的引用


考虑到我有m个东西,我必须从中获取参数(我只能通过n个父菜单类访问它们),并且参数列表可以不同。。。我真的可以用Visitor吗?这是正确的使用模式吗?

访客绝对是一个不错的选择。使用Visitor,您可以扩展类的功能,而无需修改它。“访问者”一词显然用词不当,它与模式无关,事实上它是一个非常强大的模式,因为它允许您从外部扩展类。

查看此

听起来visitor符合问题描述,但实现起来可能很困难

假设GUIElement是要序列化的对象层次结构的一部分,Manager会计算如何按照序列化顺序遍历这些元素,并且Visitor类会执行序列化工作,下面是根据您的描述我将如何看到它的动态:


已创建图表

我见过一些东西声称访问者是不透明的,因为调用无法定制。经典示例将accept()visit()作为唯一的方法。如果我有m个东西需要对每个东西至少执行2次不同的操作,我是否仍然可以使用visitor;除此之外,参数列表在某些方面可能完全不同。基本上,我需要用一个可变的参数列表做至少2*m的事情——访问者能做到吗?实际上这比2*m更糟糕。到目前为止,在我的按钮上有四个操作(获取和设置:位置和值)。一些菜单组件可能只有2个操作(get/set),其他的则是更高的偶数。您可以在visitor中拥有任意多个重载的
visit
函数。根据您的参数列表,将调用相应的函数。如果有帮助,请参阅此链接。我不确定我是否理解如何应用此示例。我想我可以使用AbstractVisitor使参数列表更灵活。我还希望有描述性的方法名,比如getButtonValue()setButtonValue()getButtonLocation()setButtonLocation(),而不是标准的“访问”/“接受”。。。我将要创建许多方法。我可以吗?我喜欢你的用户名。。。听起来你像是在为猫服务。所以听起来你是在说让每个访问者帮我做我想要的小动作(getButtonValue()),每个具体的访问者(序列化/反序列化)做它们的整个集合。)@DanS该模式的目标是将丑陋的东西封装到访问者中,而不是将其包含在GUI元素中。如果一个访问者中有太多的方法,可以将它们重构为单独的类,与访问者协作。一旦访问者控制住了局面,就会发生很多事情。所有这些更改都不需要在GUI元素中编写任何代码(理论上)。