2010-12-10 23 views
0

我想在C++中使用复合设计模式,以便能够创建和操作一组对象。我遇到的一个问题是,因为树叶和复合材料的处理方式是相同的,并且复合材料可能由树叶和复合材料组成,所以在向复合材料发出命令时,对象可能会多次运行。使用复合设计模式对不同类型的对象进行操作,是否有办法防止对象被多次操作?

例如,复合组1包含对象A和B.然后,创建一个复合组2,其中包含复合组1和对象A.当复合组2被操作时,对象A将被操作两次。对于某些应用程序,我猜这不是问题,但对于我的使用,如果对于发布到组合的任何命令,唯一对象只能运行一次,我会喜欢它。

有没有一种惯用的方法来处理这个问题,或者是一些如何防止多次调用对象的成员函数,或者阻止一个对象被多次包含在一个组合中?

-

更新: 通过“惯用的”我的意思是处理这类问题的“传统”或“接受”的方式。 我想我只是假设/希望这是一个常见的问题,有一个确定的解决方案。

+0

你的问题是对象A有两个'父母',你想在这里做什么?为什么这个对象分成两组?如果必须这样做,那么应用操作的标准思路就不会按照您的预期工作。您必须以某种方式记录您执行“此操作”的对象,并且只在对象上执行,如果没有。 – 2010-12-10 12:01:39

+0

我想要实现的是不仅从单个对象创建组的灵活性,而且还从对象和现有组的任意组合创建组 - 基本上,复合模式的用途就在于,能够将叶子和复合材料同样处理通过组件接口? – zebraman 2010-12-10 17:20:42

回答

1

我不知道你是什么意思的惯用,但一个解决方案将取决于如何遍历复合材料的结构。这里有一些选择

  • 如果你使用一个访问者和记已经访问组件,忽略重复
  • 使用滴答计数和具有复合元素在两忽略具有相同刻度计数连续调用
  • 一步法收集所有需要在一组中操作的复合对象,然后在两步法中执行您的操作
  • 在您的复合对象中设置一个标志,表示这一轮被触摸的时间,清除标志之前下一轮
+0

谢谢,我想我会尝试标记方法。但是,想知道的是,这种类型的问题(不想多次调用对象的成员函数)通常不与Composite模式相关联?我觉得它必须是。还是通常用于应用程序的复合模式无关紧要?如果我想确保每个对象只有一个函数调用,是否有更好的设计模式? – zebraman 2010-12-10 17:24:41