web-dev-qa-db-ja.com

デザインパターン:コンポジットとコンポジション

デザインパターンのコースを終えていますが、ノートを確認しているときに、学期中に見逃したものに出くわしました:コンポジット構成。私が理解できたのは、合成とはオブジェクトが実際にオブジェクト全体をカプセル化するときであり、合成とはオブジェクトへのポインターのみを保持するときであるということです。

  1. これは正しいですか?誰かが私にこれをもう少しよく説明できますか?
  2. どちらを優先するのはいつですか?
28
Baruch

構成

これはデザインコンセプトです(実際にはパターンではありません)。この用語は、あるオブジェクトに別のオブジェクトが含まれていることを説明する場合に使用されます。 継承をめぐる構成 ディスカッションで頻繁に発生します。

さらに、構成は強い所有権を意味します。 1つのオブジェクトが別のオブジェクトの所有(つまり、ライフサイクルを管理)します。親が破壊されると、すべての子も破壊されます。そのような強い関係がない場合(子供は親よりも長生きすることができます)、私たちは集約について話します。

引用 ウィキペディアの素晴らしい例

たとえば、大学にはさまざまな学部(化学など)があり、各学部には多数の教授がいます。大学が閉鎖されると、学部は存在しなくなりますが、それらの学部の教授は引き続き存在します。したがって、大学は学部の構成と見なすことができますが、学部には教授の集合体があります。さらに、教授は複数の学部で働くことができますが、学部が複数の大学の一部になることはできません。

ご覧のとおり、所有権関係のタイプに応じて、構成または集約のいずれかを選択する必要があります。

複合パターン

これは、子が単純なノードまたは他のノードのコンテナ(おそらく他の子を含む)である可能性がある親子の強い関係を記述するGoFデザインパターンです。

これは、GUIやツリーのような構造で非常に一般的です。例えば。 in Java Swing JPanelは、テキストフィールド、ラベル、リストなどのさまざまなコントロールを保持できますが、他のJPanelsも保持できます。単純なコンポーネントとさらにネストされたパネルを含めることができます。

通常、Compositeデザインパターンはcompositionを使用しますが、場合によっては、親がすべての子を所有する必要はありません。 GUIの例を続けるには、1つのパネルを別の場所に移動します(親を変更します)。

50