1

我知道这个理论,但很明显,当涉及到现实世界时,我就是不知道。在下面的示例中,游戏和玩家/棋盘之间的关系是一个组合(它们在 Game 类中被实例化)?在棋盘和棋子之间 - 聚合,因为棋盘可以存在 0 个棋子?

Class Game
{
   Player p;
   Gameboard b;
  void Start()
  {
     p=new Player();
     b=new Gameborad();
  }
}

class Gameboard
{
   List<pawn> listOfpawns=new List<pawn>();
}
}
4

3 回答 3

1

组合和聚合的区别不在于棋盘是否可以存在零棋子,而在于棋子是否可以没有棋盘存在,以及玩家和棋盘是否可以没有棋子存在。

换句话说,如果摧毁一个游戏会摧毁所有的玩家和棋盘,那么你就有了组合。如果玩家和棋盘可以存在于游戏之外,那么你就有了聚合。

如果用破坏棋子破坏棋盘,那么您就有了构图。如果棋子可以在没有棋盘的情况下生存,那么您就有了聚合。

一般来说,如果销毁容器会破坏其元素,那就是组合。存在不依赖于容器的元素被称为聚合持有。

聚合的经典示例是:

  • 联盟内的国家,因为如果联盟解散,国家将继续存在
  • 组织内的人,因为当组织不复存在时,人们仍然活着

组成的经典例子是:

  • 一个人的日程表,因为如果这个人离开了,日程表也会跟着走。
于 2013-10-30T16:13:56.137 回答
0

作品

一个对象包含其他对象,按值存储。这些通常是您认为是持有它们的对象内部的元素,例如 cardDeck 对象具有卡片对象。即使甲板最初没有被填满,这些物体也大多只持有物体内部才有用途。

聚合

一个对象包含对其他对象的引用,聚合对象是在另一个上下文中存在于程序中的东西,而父对象只是出于组织或功能原因而持有它们。以下站点参考中给出的示例是一个包含人员对象的平面。这些人可以来来去去,并且可以用于程序的其他部分。

在这种情况下:

我想说的你的例子更多地属于作文。就像一副纸牌一样,棋子在棋盘之外几乎没有意义。

术语

“按价值”或“按引用”的字面意义取决于语言,当人们在这种情况下说其中一个或另一个时,他们用它来指代父母之间的拥有关系有多强。

当然在Java中所有对象都是通过引用存储的,但是!只要不存在对对象的引用,它最终就会被 GC 剔除。飞机很可能持有对发动机的唯一参考,因此当飞机被移除时发动机会死机。人们可以在飞机之外有其他东西来引用他们,所以你可以认为它不像飞机直接持有他们。

(参考http://atomicobject.com/pages/Aggregation

于 2013-10-30T16:16:22.623 回答
0

Ray 和 Vigilant 是正确的,但适合您的更多取决于应用程序的(目标),而不是对象本身。

  • 游戏玩家:
    • 如果应用程序是 ad-hoc 游戏: Player 将是 Composite
    • 如果应用程序对玩家进行更多操作(保持分数/排名):玩家将是聚合

或者

  • 飞机/发动机:
    • 如果应用程序是航空公司:引擎将是复合的
    • 如果应用程序是维护:引擎将是聚合
于 2013-11-28T09:37:12.287 回答