聚合,结社和作文

我有一个简单的例子:

public class Order { private ArrayList orders = new ArrayList(); 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; } } 

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

这是什么类型的关系,为什么?

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

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

更新以解决您的评论:

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

 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中的方法使用,因此存在关联。

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

 class Product; class Factory { Product *product; product = new Product(); product createProduct() { return new(product); } }; class Product { ArrayList *orders = new ArrayList(); void createOrder() { orders.add(OrderInfomation); } } class Order { string orderID; string orderName; Customer customer; }; class Customer { string cusID; string cusName; string cusAddress; }; 

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

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

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

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

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

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

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

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

@Bill the Lizard

谢谢你的解释,但在你的关联例子中,一个类中仍然没有引用/指针到另一个类…

我问是否有可能在A类字段中:B instanceOfB = new B()并告诉A和B是关联的(但不是聚合,也不是组合!)

我正在考虑它,因为根据这里所说的不可能,但是……我在这里找到: 关联,聚合和组合之间的区别这样的例子:

 [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”的东西; 无论我们如何看待这些类,它总是意味着这是聚合或组合?

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