用Java实现组合

时间:2018-01-19 09:52:58

标签: java uml relationship composition

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

class Chapter {
    private Book book;
}

Relationship

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

1 个答案:

答案 0 :(得分:1)

这还不够。

在撰写关系中,如果whole实例被销毁,part实例也应立即销毁

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

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

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

在此参考文献中:Object Prime,Third Edition(作者Scott W. Ambler,2004)
在( 13.4.12.7实施组合

  

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

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


考虑这个例子:

class Person {
   private final Brain brain;
   Person(Brain humanBrain) {
      brain = humanBrain;
   }
}

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

Brain b = new Brain(); 
       // or we have an instance of Brain in other scopes
       // not exactly in this scope

Person p1 = new Person(b);
Person p2 = new Person(b);

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

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

例如,以下示例可以是合成。因为Part被删除后whole的实例被删除了:

public class House {    
   private final Room room;

   public House() {    
       room = new Room();
   }
}

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

我们应该建立一种机制,在删除part时删除whole如果我们不删除part并在其他wholes中使用它,那么它就是聚合或关联