43

我试图确认我对关联、聚合和组合的代码的理解。所以这里。

聚合:有一个。它另一个类型的现有对象

public class Aggregation
{
    SomeUtilityClass objSC
    public void doSomething(SomeUtilityClass obj)
    {
      objSC = obj;
    }
}

组成:由另一个对象组成

public class Composition
{
    SomeUtilityClass objSC = new SomeUtilityClass();
    public void doSomething()
    {
        objSC.someMethod();
    }
}

公会:我对此有两种看法。

  1. 当一个类与另一个类关联时。因此,以上两者都是关联的示例。

  2. 关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。

    public class Association
    {
        //SomeUtilityClass objSC   /*NO local reference maintained */
        public void doSomething(SomeUtilityClass obj)
        {
           obj.DoSomething();
        }
    }
    

我的理解正确吗?我在这里这里读过相互矛盾的文章,所以我真的不确定该看哪一篇。我的理解似乎与第一个链接一致。我觉得第二个链接是错误的,或者也许我没有正确理解它。

你怎么看?

4

3 回答 3

61

对于两个对象FooBar我们有:

依赖:

class Foo
{
    ...
    fooMethod(Bar bar){}
    ...
}

协会:

class Foo
{
    private Bar bar;
    ...
}

作文:(死时Foo也是如此Bar

class Foo
{
    ...
    private Bar bar = new Bar();
    ...
}

聚合:(Foo死亡时,Bar可能继续存在)

class Foo 
{
    private List<Bar> bars;
}
于 2014-04-18T16:01:42.830 回答
24

聚合和组合之间的区别非常模糊,AFAIK 与容器被销毁后“子”对象的逻辑存在有关。因此,在聚合的情况下,容器内的对象在容器对象被销毁后仍然可以存在,而在组合设计的情况下,它们也需要被销毁。一些类比:

  • 一个Car包含四个对象的Wheel对象。通常,如果您破坏汽车(通过调用某种方法来清理它),您还应该在此过程中破坏车轮,因为它们存在于汽车之外几乎没有意义(除非您将它们移动到另一个Car物体上)。更实际地,包装输入流的读取器对象也会在内部流自身关闭时关闭。这是作文
  • 一个Person对象包含(拥有)一个Radio对象。如果Person死了,它Radio可能会被另一个人继承,Person即它在没有原始所有者的情况下存在是有意义的。更现实地,一个包含对象的列表并不要求在释放列表本身时释放所有对象。这是聚合

编辑:阅读您的链接后,我倾向于使用第一个链接,因为它给出的解释类似于我的。

此外,关联只是通过对该对象的引用调用另一个对象的方法(发送消息)。

于 2012-09-26T14:40:45.247 回答
2

如果继承给了我们'is-a',组合给了我们'part-of',我们可以说聚合给了我们一个'has-a'关系。

==> 简而言之,关联、聚合和组合是表示对象之间关系的术语

  1. 关联:关联意味着一个对象"uses"另一个对象。正如您所说:“关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。”
public class Association
{
    //SomeUtilityClass _obj   /*NO local reference maintained */
    public void doSomething(SomeUtilityClass obj)
    {
       obj.DoSomething();
    }
}
  1. 聚合
  • 聚合是一种特殊类型的关联。
  • 聚合是"has-a"对象之间的关系(white diamond)
  • 例如,Person 'has-a' Address
public class Address  
{  
 . . .  
}  
public class Person  
{  
     private Address address;  
     public Person(Address address)  
     {  
         this.address = address;  
     }  
     . . .  
}  

如您所见,Person不管理Address的生命周期。如果 Person 被销毁,Address 仍然存在。

在此处输入图像描述

  1. 组成
  • 组合是一种特殊类型的聚合,它是一种强类型聚合。
  • 构图给了我们一种'part-of'关系(dark diamond)。例如:发动机是汽车的一部分
public class Engine  
{  
 . . .   
}  
public class Car  
{  
    Engine e = new Engine();  
    .......  
}  

在此处输入图像描述

请选择以下链接以获取未来信息:

于 2021-06-17T01:29:07.297 回答