2016-08-03 75 views
0

考虑下面的类:设计模式:哪个UML关系最能描述这个类?

public class CardGame extends Game { 
    private CardDeck[] cardDecks; 
    public CardGame(int numCardDecks) { 
     super(); 
     cardDecks = new CardDeck[numCardDecks]; 
     for (int i=0; i < numCardDecks; i ++) { 
      cardDecks[i] = new CardDeck(); 
     } 
    } 
} 

哪个UML关系最能说明这个类? (?为什么)
- 聚合 - 组成 - 泛化 - 工厂

注:我觉得这个单项选择题测试问题本身没有明确的规定。

+0

你能解释一下你为什么想知道这个吗?聚合和合成为模型添加了很少的语义,只有在少数情况下。 –

+0

@YuChen,这看起来像作业。你认为答案是什么,为什么? – jaco0646

+0

@ jaco0646非常接近,实际上是Java专业证书的商业模拟测试中的一个问题。我在辩论答案,概括,并发现自己与这里的其他职业一致。我相信,没有什么真正复杂的,反馈意见,还有其他一些错误答案的问题已经提交。 –

回答

3

聚合,合成和泛化是表示不同类型关系即逻辑连接类型的UML(类图)符号。

您的情况'游戏'是'CardGame'的泛化; 'CardGame是'游戏'的专业化。我想说的是,在你的情况下,'CardDecks'与你的'Cardgame'有构成关系,因为你的卡片是在'CardGame'类中创建的,并且如果你删除'CardGame'就会被删除,即“暗含关系,孩子不能独立于父母而存在“(What is the difference between aggregation, composition and dependency?)。但是,如果您将特定的“CardDecks”存储在数据库中,或者如果您试图对可在其他游戏中使用这些卡的真实世界进行建模,那么它就是Aggregation。您的CardDeck类是“工厂方法”,因为它是创建对象的类。

我不认为这应该归类为设计模式,因为它是一个设计模式,它必须描述软件设计中常见问题的循环解决方案。 “在软件工程中,设计模式是软件设计中常见问题的一个可重复使用的解决方案,设计模式并不是一个完全可以直接转换为代码的设计,它是一个描述或模板,用于如何解决可以在许多不同情况下使用的问题。“ (https://sourcemaking.com/design_patterns

+0

精通,赞同。 –

3

Game可以推广CardGameCardGame从它派生的。

我认为cardDecksCardDeck作为CardGame控制它们的寿命,并且该代码的上下文中的组合物,它们只能属于该CardGame

+0

Ehm ...你想说游戏是CardGame的泛化,不是吗?注意,空三角箭头应该去游戏块。 – Gangnus

+0

当然。也许正确的语言是“游戏”概括'CardGame''? –

+0

箭头被称为“泛化”。所以,当然,你的变体更具可读性和可理解性,但是提问者试图理解UML俚语......因此,这两种变体都可以由我自己决定。现在你的答案是正确的,简短而充分 - 理想的变体。 – Gangnus