使用什么设计模式?

6
问题是对以下内容进行建模:
一个军队内部的层次结构,从整个国家军队开始,经过野战军、子单位,最终到达个人士兵。每个层次可能涉及到与其他类的链接,例如将军或军官等。例如,野战军中的单位需要能够相互通信,特别是为了建模士气、凝聚力等,以及与任何敌方野战军的通信(例如,我的军队中一支部队的溃败会对敌方士气产生积极影响)。此外,每个单位都需要与其在层次结构上方和下方的单位进行通信(出于明显的目的)。
我考虑在这些实体类中使用实际指针(可能是双向的)来表示物理层次结构中的链接(例如,在每个单位中使用“army *”,在每个军队中使用“unit *”或整个集合),然后利用观察者设计模式来实现其他情况下的通信(例如我上面提到的情况)。
然而,我不是设计模式或编程方面的专家,因此不知道是否有其他更有效的方法来解决这个问题。如有帮助,将不胜感激。
3个回答

3

听起来像是“小男孩遇到模式”综合症。你在寻找一种模式,而不是思考你的问题。

对于层次结构来说,自然的数据结构是树形结构。我会从这个方面入手。

如果要求树中的每个单元都必须与所有其他单元通信,那么观察者模式可能不适合你。每个单元都必须向所有其他单元注册。每当事件被触发时,你就会遇到N平方级别的消息风暴。

调停者模式可能更好。单元将事件发送给调停者,允许使用者注册接收特定类型的消息的兴趣。生产者和消费者只知道调解者,而不知道彼此。松散耦合是你的朋友。


好的,我已经“解决”了这个问题,并使用指针创建了可工作的代码,而且有很多指针。现在我想应用更好的OO/设计模式方法来解决它,看看是否可以更优雅或更有效地完成。我认为可以,因此提出了我的问题。谢谢你的帮助。 - Kristian D'Amato
@Kristian - 从你的原始帖子中无法确定这一点。我刚刚重新阅读了它,无法确定这是一个假设性问题还是一个现有解决方案的描述。 - duffymo
是的,可能存在解决方案或者不存在都不是重点。我相信其他人也曾经建模过类似的问题,可能会有比我的更好的解决方案。 - Kristian D'Amato

3
有一种模型/设计模式用于在不知道彼此存在的情况下,在不同实体之间传递事件。这个模式叫做“发布/订阅”。
每个实体都将其要发布的事件发送到代理,并告诉代理它对哪些事件感兴趣。代理处理确保订阅实体了解发布的他们感兴趣的事件。
这类似于观察者模式,但在观察者模式中,每个感兴趣的实体单独订阅它想要的每个实体的事件。我认为这可能会导致很多开销,因为这需要每个人关心事物的创建和销毁。
无论如何,这里有一个很好的维基百科文章关于发布/订阅
我会使用组合模式(基本上是某种形式的树)来处理各个军队。可能会使用观察者模式处理层次结构或兄弟关系上下关系。但是观察者模式需要太多的注册和注销才能在一般情况下可行。

1

对于建模结构,这看起来像是经典的组合模式应用。然后,您可以使用访问者解释器来对子单元进行操作建模。


谢谢,我会看一下这些模式(对它们还不是很熟悉)。 - Kristian D'Amato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接