关联、组合和聚合 - 使用 java 实现

Posted

技术标签:

【中文标题】关联、组合和聚合 - 使用 java 实现【英文标题】:Association, Composition and Aggregation - Implementation with java 【发布时间】:2012-11-14 05:57:17 【问题描述】:

我对@9​​87654322@ 有点困惑。尽管有大量的网站和论坛讨论这个话题,但在阅读了其中一些之后,我变得更加困惑。

我想知道以下是否正确:

1.) 聚合 - 如果整体被破坏,将存在。例如,Engine 可以在有或没有Car 的情况下存在。

2.) 组合 - 如果对象被销毁,则将不存在。例如,没有HouseRoom 就无法存在。

3.) 关联 - 我不确定在什么情况下我们应该使用它。有人可以对此发表评论吗?

在编写用于聚合、组合和关联的 Java 代码时

4.) 聚合

Class Car 

    private Engine engine;

    public void setEngine(Engine engine)
     this.engine=engine;
      

    public Engine getEngine()
     return engine;
    

我认为如果是聚合关联,那么应该定义accessors and mutators。这是正确的吗?

根据我对聚合的定义,我提到如果Car 对象被销毁,则Engine 可以被访问。但是,我没有在上面的代码中看到这种情况。如果 Car 对象被销毁,将无法像car.getEngine() 那样访问引擎。那么这是怎么发生的呢?

作曲

Public House 
   private Room room;
   Public House ()
      room = new Room (int noRooms, String nameOfHouse);

   

我认为如果它是C0mposition,那么不应该有任何accessor mutator 函数。并且对象Room 只能在构造函数内部创建。并且持有 room 对象的实例方法必须是 Private ?我说的对吗?

注意:我再次用谷歌搜索,并访问了许多网站/论坛,试图消除我的疑虑。许多论坛上都发布了类似的问题,但我对此感到更加困惑。有人可以帮我消除我的疑虑。谢谢!

【问题讨论】:

差不多:***.com/questions/9862286/… 【参考方案1】:

关联的类型对您如何实现它几乎没有影响。它是聚合或组合的事实只是语义上的差异。

如果对象被持久化在某个数据库中,就会出现差异。在这种情况下,如果容器对象从数据库中删除,则包含的对象也会被删除,具体取决于关联的类型。

【讨论】:

【参考方案2】:

我们再举一个例子来定义聚合关联......一个人和一个公司......

一个人和一个公司是两个独立的实体,但是一个人可以在公司工作,他被称为员工......所以员工在外部世界中作为一个人存在。所以即使公司灭亡,但人不会灭亡......

    public class Example 

    public static void main(String[] args) 
        Person p1 = new Person("Vishal");
        Company abc = new Company(p1);
    




class Person
    String name;
    public Person(String name) 
        this.name = name;
    


class Company
    Person employee;
    public Company(Person p1) 
        employee = p1;
    

我没有深入了解公司和个人的实际定义,但我认为现在可以理解了。

而组合关联是公司和部门之间的关联。公司一旦灭亡,它的部门就没有任何意义,所以它必须灭亡……

组合关联的另一个例子是订单和订单的不同项目。您从在线商店订购了几本书 (3)。在这种情况下,如果订单被取消,则必须取消 3 个订单行(项目)。所以订单行的存在只取决于订单。

经理使用刷卡进入 XYZ 场所。经理对象和刷卡对象相互使用,但它们有自己的对象生命周期。换句话说,它们可以独立存在。这种关系中最重要的一点是没有单一的所有者。

而在聚合中一个对象拥有另一个对象...

这是关于这三个概念的一个很好的链接...对于关联,您可以检查第二个要求... http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit

【讨论】:

你能给我举个例子,比如什么时候使用Association @sharonHwk 我用一个链接编辑了答案。希望它会有所帮助。【参考方案3】:

对于 Vishal 的回答,您可以有一个 Employee 类扩展 Person 类,以便 Company 持有 Employee 而不是 Person,当公司被销毁时,Employee 会随之而来(作为垃圾收集)而不是 Person。这只是为了更贴近现实,可能没有必要。

【讨论】:

【参考方案4】:

涵盖所有可能的关联 java 代码是一个困难的问题。最好的办法是下载 EclipseUML Omondo,它是一种 Java 到 UML 的圣经。此工具仅用于 UML 到 Java 的映射。没有 MDD 但实时同步。 你可以看看你从类图中得到了什么代码。

代码与图形类图实时同步,因此您可以根据需要多次播放和重做,以涵盖所有可能的 Java 代码。

还有一个 30 天的评估副本,让您有足够的时间查看 Java 代码应该是什么,即使最新版本只保留给付费客户。

【讨论】:

以上是关于关联、组合和聚合 - 使用 java 实现的主要内容,如果未能解决你的问题,请参考以下文章

java怎么理解组合/聚合关系给个例子最好能将细点

C++:关联、聚合和组合

java基础--继承实现依赖关联聚合组合的联系与区别

依赖泛化实现关联聚合组合

UML类图关系(泛化、继承、实现、依赖、关联、聚合、组合)

UMLUML类图关系(泛化 继承实现依赖关联聚合组合)