聚合,关联和组合

时间:2010-12-01 13:15:09

标签: java

我有一个简单的例子:

public class Order 
{

 private ArrayList<Product> orders = new ArrayList<Product>();

 public void add(Product p)
 {
  orders.add(p);
 }
}

是聚合还是合成? 我想这是构图,因为删除订单后订单会减少,对吗? 不幸的是,这是一项任务,答案是不同的; /你知道为什么吗?

第二个问题:

public class Client extends Person 
{
    String adress = "";

    Orders orders = new Orders();

    public Client(String n, String sn)
    {
     name = n;
     surName = sn;
    }

    public String getAddress()
    {
     return adress;
    }
    public Orders getOrders()
    {
     return this.orders; 
    }
}

是客户与订单之间的关联吗? 我的老师告诉我这是关联,但我想知道为什么它不是聚合/组合 - 他告诉我只有当一个类包含很少的不同类的实例时才会发生聚合或组合 - 是吗?我猜不是,因为例如汽车包含一个轮子和它的聚合我想?

这是什么类型的关系以及为什么?

5 个答案:

答案 0 :(得分:6)

你的第一个例子是聚合。删除订单实例时可能会删除变量orders,但每个产品仍然有意义,可以存在于Order类之外。

你的第二个例子就是对的。由于客户端包含对订单的(has-a)引用,因此这是组合(因为orders在没有Client的情况下不存在。)

更新以解决您的评论:

聚合和组合都是不同类型的关联,但它们是特定的关联类型。为了使两个类只有没有聚合或组合的关联,它们需要比给定示例更弱的链接。这是一个(人为的)例子:

class A {
    String phrase = "These pretzels are making me thirsty.";

    public String process(B b) {
        // use a B object to do something
        String tmp = b.doSomething(phrase);

        // do more processing...
        return tmp;
    }
}

class B {
    public String doSomething(String s) {
        // do something with the input string and return
        ...
    }
}

这里没有组合或聚合(A没有自己对B对象的引用),但由于B的实例在A中使用了,因此存在关联。

答案 1 :(得分:2)

我认为,第一个例子不是聚合而是组合。因为订单组成了产品。如果删除订单,则会自动删除产品。

class Product;

class Factory {
    Product *product;
    product = new Product();
    product createProduct() {
        return new(product);
    }
};

class Product {
     ArrayList<Order> *orders = new ArrayList<Order>();

     void createOrder() {
         orders.add(OrderInfomation);
     }
}

class Order {
    string orderID;
    string orderName;
    Customer customer;
};

class Customer {
    string cusID;
    string cusName;
    string cusAddress;
};

此处产品可以具有相同的订单类型。如果产品被删除,那么订单将被删除。所以这是一个组合。 (强烈耦合或死亡关系)

在您的情况下,订单与产品相关联。一个订单可以有任何产品订单。所以这是一个协会。如果订单被删除,则产品将存在。 (轻微耦合) 同样,客户和订单也有关联关系。

工厂和产品汇总。即使产品被删除,工厂也会存在。

答案 2 :(得分:1)

在Java中,确实没有组合,一切都是聚合。组合可以像C ++这样的语言存在,其中对象可以在堆栈上声明,并与父对象一起生存和死亡。在Java中,一切都在堆上。

对于您的第二个问题,Order与Product有聚合关系。关联关系可以是当我们将顺序作为参数传递给产品中的方法时。 Product使用传递的引用完成工作,但不会在某些子引用中缓存该引用。

答案 3 :(得分:1)

聚合和组合都是关联。聚合意味着整体/部分关系。组合是具有终身责任的聚合:http://ootips.org/uml-hasa.html

在您的示例中,答案可能是聚合,因为存在整体/部分关系。

通常您的订单会包含订单项(而不仅仅是产品),这些订单项会被视为合成。

答案 4 :(得分:0)

@Bill the Lizard

感谢您的解释,但在您的关联示例中,一个类中仍然没有引用/指针到另一个类...

我问过是否有可能进入A级领域: B instanceOfB = new B() 并告诉A和B是关联的(但不是聚合,也不是组合!)

我正在考虑它,因为根据这里所说的,这是不可能的,但...... 我在这里找到:Difference between association, aggregation and composition 这样的例子:

[Example:]

|A|----------->|B|

class A
{
  private:
    B* itsB;
};

这是作为关联的一个例子给出的,并且有指向其他类的指针......(我想我们可以或多或少地在Java类中处理引用,就像我们在这里处理这个指针一样) 所以在Java中它看起来像:

[Example:]

|A|----------->|B|

class A
{
  private:
    B itsB;
};

这是否意味着在某些情况下我们可以在上面的例子中有关联? 我们对课程的看法有何不同? 如果A是汽车,而B是车轮,它将会聚集,因为汽车有车轮。 如果A是例如人和B是例如国家它将是协会,因为人没有国家,但我们可能想记住这个人最近访问过的国家的名字? 或者如果在A类中有类似“B itB”的东西;无论我们如何看待这些类,它总是意味着这是聚合或组合?

我的思维方式是正确还是我说废话,这很可能,因为我只是猜测;)