43

アソシエーション、アグリゲーション、およびコンポジションのコードがどのように見えるかについて、私の理解を確認しようとしています。だからここに行きます。

集計: Has-a. 別のタイプの既存のオブジェクトがあります

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

構成: 別のオブジェクトで構成されています

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

関連: これについては 2 つの意見があります。

  1. あるクラスが別のクラスに関連付けられている場合。したがって、上記の両方が関連付けの例です。

  2. アソシエーションは、クラスが受け取るオブジェクトへの参照を保持しない集約の弱い形式です。

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

私の理解は正しいですか?ここここで相反する記事を読んだので、どちらに従うべきか本当にわかりません. 私の理解は最初のリンクと一致しているようです。2 番目のリンクが間違っていると思います。または、正しく理解していない可能性があります。

どう思いますか?

4

3 に答える 3

61

2 つのオブジェクトの場合Foo、次のBarようになります。

依存:

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は、コンテナが破棄された後の「子」オブジェクトの論理的な存在に関連しています。したがって、集約の場合、コンテナオブジェクトが破棄された後も、コンテナ内のオブジェクトは存在できますが、コンポジションデザインの場合は、それらも破棄される必要があります。いくつかのアナロジー:

  • 4つのCarオブジェクトを含むWheelオブジェクト。通常、車を破壊する場合(何らかのメソッドを呼び出してクリーンアップすることにより)、ホイールを車の外に存在させることはほとんど意味がないため(別のCarオブジェクトに移動しない限り)、その過程でホイールも破壊する必要があります。より現実的には、入力ストリームをラップするリーダーオブジェクトは、それ自体が閉じられたときに内部ストリームも閉じます。これが作曲です。
  • オブジェクトには、Personオブジェクトが含まれます(所有されます)RadioPerson死んだ場合、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 に答える