用Java实现组合

swe*_*wei 5 java uml composition relationship

class Book {
    private Chapter[] chapters = new Chapter[5];
 }

class Chapter {
    private Book book;
}
Run Code Online (Sandbox Code Playgroud)

关系

这是实现上述关系的正确方法吗?我需要对此进行解释.谢谢.

Gho*_*ani 5

这还不够。

\n\n

在组合关系中,如果whole实例被销毁,则part实例也应该立即被销毁

\n\n

你应该有一些代码(一些机制)来做到这一点。

\n\n

例如,如果您从类外部推送 s 的实例(例如通过使用构造函数),则在删除实例Chapter时应小心删除这些实例。Book

\n\n

如果您的实例是在Book类中创建的(通过 new ...),则无需执行任何操作,您的Chapter实例将随实例一起删除Book

\n\n

在此参考文献中:Object Prime,第三版(作者:Scott W. Ambler,2004 年)
\nin 部分(13.4.12.7 实现组合

\n\n
\n

正如您可能已经猜到的,聚合和组合关联的处理方式与关联完全相同。从编程的角度来看,主要区别在于聚合意味着两个类之间的关系比关联更紧密,而组合 意味着更紧密的关系。虽然图\n 13.11 不包括作文关联,但研讨会和课程之间的关联是紧密的,事实上,至少与您在作文中看到的\n 一样紧密(不幸的是,在这种情况下,句子规则\n 没有意义) )。在图 13.31 中,您可以在 Course\n 类\xe2\x80\x94 中的remove() 方法的实现中看到这种密切性的结果。当课程被删除时其研讨会也会被删除这种类型 的生命周期管理代码在组合层次 结构中是典型的。

\n\n
/**\n * Remove a course\n *\n * @postcondition The course and its seminars will be removed\n */\npublic void remove() \n{\n  if (getSeminars() != null) {\n    // Clone the original set because we can\'t safely remove\n    // the items from the set while we iterate over it\n    HashSet set = (HashSet) getSeminars().clone();\n    Iterator iterator = set.iterator();\n    // Remove each seminar of this course\n    while (iterator.hasNext()) {\n      Seminar seminar = (Seminar) iterator.next();\n      // Remove the seminar from the collection\n     getSeminars().remove(seminar);\n    }\n  }\n  // Remove the instance from permanent storage\n  // Persistence code ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n


\n考虑这个例子:

\n\n
class Person {\n   private final Brain brain;\n   Person(Brain humanBrain) {\n      brain = humanBrain;\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在代码的其他部分我们可以这样定义:

\n\n
Brain b = new Brain(); \n       // or we have an instance of Brain in other scopes\n       // not exactly in this scope\n\nPerson p1 = new Person(b);\nPerson p2 = new Person(b);\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,在这段代码中,我们可以将 的一个实例设置Brain为两个不同的Persons.

\n\n

注意:在组合中,我们应该管理实例的生命周期。只定义private final任何类的a,不显示它们之间的组合。

\n\n

例如,下面的示例可以是一个组合。Part因为删除时删除的实例whole

\n\n
public class House {    \n   private final Room room;\n\n   public House() {    \n       room = new Room();\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在组合中:
\nwhole可能直接负责part. 或者它可能使用已经从类外部(通过代码的其他部分)创建和管理的“部分”。在这种情况下,删除part应由外部代码管理,并且part应在删除后立即删除whole

\n\n

我们应该建立一个机制,part该删除就删除whole如果我们不删除part并将其用于其他用途,wholes则为聚合或关联

\n

  • 你的第一个说法是错误的。该协会并不禁止双向导航。所以你可以在“Chapter”中包含“book”。 (3认同)