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)
这是实现上述关系的正确方法吗?我需要对此进行解释.谢谢.
这还不够。
\n\n在组合关系中,如果whole实例被销毁,则part实例也应该立即被销毁。
你应该有一些代码(一些机制)来做到这一点。
\n\n例如,如果您从类外部推送 s 的实例(例如通过使用构造函数),则在删除实例Chapter时应小心删除这些实例。Book
如果您的实例是在Book类中创建的(通过 new ...),则无需执行任何操作,您的Chapter实例将随实例一起删除Book。
在此参考文献中: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\nRun Code Online (Sandbox Code Playgroud)\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
\n考虑这个例子:
class Person {\n private final Brain brain;\n Person(Brain humanBrain) {\n brain = humanBrain;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在代码的其他部分我们可以这样定义:
\n\nBrain 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);\nRun Code Online (Sandbox Code Playgroud)\n\n因此,在这段代码中,我们可以将 的一个实例设置Brain为两个不同的Persons.
注意:在组合中,我们应该管理实例的生命周期。只定义private final任何类的a,不显示它们之间的组合。
例如,下面的示例可以是一个组合。Part因为删除时删除的实例whole:
public class House { \n private final Room room;\n\n public House() { \n room = new Room();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在组合中:
\nwhole可能直接负责part. 或者它可能使用已经从类外部(通过代码的其他部分)创建和管理的“部分”。在这种情况下,删除part应由外部代码管理,并且part应在删除后立即删除whole。
我们应该建立一个机制,part该删除就删除whole。如果我们不删除part并将其用于其他用途,wholes则为聚合或关联。