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

5

我有一些关于“关联、聚合和组合”的困惑。虽然许多网站和论坛都讨论过这个话题,但是在阅读其中一些内容后,我变得更加困惑了。

我想知道以下几点是否正确:

1.) 聚合 - 整体被销毁时仍然存在。例如,一个 Engine 可以与或没有 Car 存在。

2.) 组合 - 如果对象被销毁,则不存在。例如,没有 House 就不能存在 Room

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

当涉及编写聚合、组合和关联的 Java 代码时

4.) 聚合

Class Car {

    private Engine engine;

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

    public Engine getEngine(){
     return engine;
    }
}

我认为如果这是一个聚合关联,那么应该定义访问器和更改器。这个想法正确吗?

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

组合

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

   }
}

我认为如果是组合关系,则不应该有访问器和修改器函数,并且对象Room只能在构造函数中创建。包含room对象的实例方法必须是私有的,我正确吗?
注:再次强调,我已经使用谷歌并访问了许多网站/论坛来解决我的疑虑。类似的问题在许多论坛上发布过,但我仍然对此感到更困惑。有人可以帮助我解决疑虑吗?谢谢!

几乎完美:https://dev59.com/smHVa4cB1Zd3GeqPrvBt?rq=1 - nawfal
4个回答

2

关联类型对于实现它的方式影响不大。聚合和组合只是语义上的差异。

如果对象被持久化在数据库中,这时候区别就出现了。在这种情况下,如果容器对象从数据库中移除,那么根据关联类型,包含的对象将会被移除或不被移除。


1
为了定义聚合关联,我们采用另一个例子......一个人和一家公司......
一个人和一家公司是两个不同的实体,但是一个人可以在一家公司工作,并被称为员工......因此,员工在外部世界中作为个人存在。因此,即使公司灭亡,但人不会消亡......
    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 吗? - Sharon Watinsan
@sharonHwk 我已经编辑了答案并添加了一个链接。希望它能有所帮助。 - Vishal

1

继Vishal的回答之后,您可以创建一个扩展Person类的Employee类,这样Company将持有一个Employee而不是Person,当公司被销毁时,Employee也会随之消失(被垃圾收集),而不是Person。这只是为了更贴近现实,可能并非必要。


0

覆盖所有可能的Java关联代码是一个困难的问题。最好的方法是下载EclipseUML Omondo,这是一种Java到UML圣经。该工具仅用于UML到Java映射。没有MDD但有实时同步。

您可以查看从类图中获取的代码。

代码是从图形类图实时同步的,因此您可以随意玩耍和重做,以涵盖所有可能的Java代码。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接