关联,组合和聚合 - 用java实现

时间:2012-11-26 17:43:15

标签: java associations uml composition aggregation

我对Association, Aggregation and Composition感到有点困惑。尽管有大量的网站和论坛讨论了这个话题,但在阅读其中一些内容后我变得更加困惑。

我想知道以下内容是否正确:

1。)聚合 - 如果整个被销毁,则存在。例如,Engine可以存在或不存在Car

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

3。)协会 - 我不确定,在什么情况下我们应该使用它。有人可以对此发表评论。

编写聚合,组合和关联的Java代码

4。)聚合

Class Car {

    private Engine engine;

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

    public Engine getEngine(){
     return engine;
    }
}

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

根据我对Aggregation的定义,我提到如果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?我是对的吗?

注意:再一次,我用谷歌搜索,并访问了许多网站/论坛试图清除我的怀疑。在许多论坛发布了类似的问题,但我只是对此更加困惑。有人可以帮助我清除我的怀疑。谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

除了Vishal的答案之外,你可以让一个Employee类扩展Person类,这样公司就会拥有一个Employee而不是一个Person,当公司被销毁时,Employee会随之而去(收集为垃圾)而不是Person。这只是为了与现实更加相似,而且可能没有必要。

答案 3 :(得分:0)

覆盖所有可能的关联java代码是一个难题。最好的方法是下载EclipseUML Omondo,这是一种Java到UML圣经。此工具仅适用于UML到Java映射。没有MDD但是实时同步。 Yoiu可以查看您从类图中获得的代码。

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

仍有30天的评估版本,即使最新版本仅保留给付费客户,也可以让您有足够的时间查看java代码。