首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >聚合、关联和组合

聚合、关联和组合
EN

Stack Overflow用户
提问于 2010-12-01 21:15:09
回答 5查看 32.2K关注 0票数 5

我有一个简单的例子:

代码语言:javascript
运行
复制
public class Order 
{

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

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

它是聚合还是组合?我猜是组合,因为订单删除后订单会被删除,对吧?不幸的是,这是一项任务,答案是不同的;/你知道为什么吗?

第二个问题:

代码语言:javascript
运行
复制
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; 
    }
}

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

这是一种什么类型的关系?为什么?

EN

回答 5

Stack Overflow用户

发布于 2010-12-01 21:30:31

您的第一个示例是聚合。在删除Order实例时,变量orders可能会被删除,但每个Product仍然有意义,并且可以存在于Order类之外。

在您的第二个示例中,您是正确的。因为Client包含对Orders的(has-a)引用,所以这是组合(因为没有Client就不存在orders )。

更新以解决您的评论:

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

代码语言:javascript
运行
复制
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中的方法使用,因此存在关联。

票数 6
EN

Stack Overflow用户

发布于 2012-06-03 12:13:17

我认为,第一个例子不是聚合,而是组合。因为这里的订单构成了产品。如果订单被删除,那么产品将被自动删除。

代码语言:javascript
运行
复制
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;
};

在这里,Product可以具有相同的订单类型。如果产品被删除,那么订单也将被删除。所以这是一首曲子。(高度强耦合或死亡关系)

在您的案例中,订单与产品相关联。一个订单可以包含任何产品订单。所以这是一种关联。如果订单被删除,则产品将存在。(轻度耦合)类似地,客户和订单具有关联关系。

Factory和Product是聚合的。即使删除了产品,工厂也会存在。

票数 2
EN

Stack Overflow用户

发布于 2010-12-01 21:27:46

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

对于您的第二个问题,Order与Product具有聚合关系。关联关系可以是当我们将order作为参数传递给product中的方法时。Product使用传递的引用执行此工作,但不会将该引用缓存到某个子引用中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4324704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档