どう言えばいいでしょうか? !動物(結合体)と同じように、子孫(葉っぱのオブジェクト)を産むと、その子孫にはある機能(例:穴を掘る、耳が聞こえるなど)が生まれます。ルート (複合オブジェクト) があり、その後、ツリーから外側に伸びる他の枝 (複合オブジェクト) と、それらの枝から外側に伸びる葉 (リーフ オブジェクト) があります。言い換えれば、祖先がすでに存在する場合、この祖先から派生した他の子(この祖先の下に結合された他のオブジェクトを含む)がすでに特定の機能を持っている限り、それは継承に似ています。 「合成パターン」では、合成オブジェクトの階層にリーフオブジェクトと合成オブジェクトの2種類のオブジェクトがあります。組み合わせたパターンは、多数のオブジェクトを操作するのに適しています。
「合成モード」とは、プロジェクトで作業するときに、プロジェクトに表示されるすべてのメソッドを合成オブジェクト (リーフ オブジェクトのメソッドを含む) で定義する必要があり、それらのリーフ オブジェクトが合成オブジェクトを継承することを意味します。複合オブジェクトがインスタンス化されると、それに応じてそのリーフ オブジェクトのメソッドもインスタンス化されます。私が言ったことは少しわかりにくいかもしれませんので、例を使って説明しましょう。
「コンポジションモード」は、ウェブ上で動的なユーザーインターフェイスを作成するために調整されたモードです。このパターンを使用すると、単一のコマンドで複数のオブジェクトに対して複雑な動作または再帰的な動作をトリガーできます。
「結合モード」を使用すると、次の 2 つの大きな利点が得られます。
1. オブジェクトのコレクションと特定のサブオブジェクトを同じ方法で処理できます。
2. サブオブジェクトのバッチをツリー構造に編成するために使用でき、ツリー全体を走査できます。
結合モードは、次の 2 つの条件が同時に満たされる場合にのみ適しています:
1. 特定の階層システムに編成されたオブジェクトのバッチがある (開発中に特定の構造が不明な場合があります)。
2. このオブジェクトのバッチまたはその一部に対して操作を実行したいと考えています。
例を見てみましょう:
具体的な要件は、フォト ギャラリーを作成し、フォト ギャラリーの特定の部分を選択的に非表示または表示できるようにすることです。これは、単一の画像または画像のギャラリーである場合があります。この関数を完了するには、画像ライブラリとして使用される複合オブジェクト クラスと、画像自体に使用されるリーフ オブジェクト クラスの 2 つのクラスが必要です。コードは次のとおりです。
上記のコードで、最初に定義されているのは、複合オブジェクト クラスとリーフ オブジェクト クラスが実装する必要があるインターフェイス。ビジョンとペニーの従来の組み合わせに加えて、このタイプの操作には非表示と表示のみが含まれます。次に、葉オブジェクトを定義します。リーフ オブジェクトは非表示と表示を実装します。 コードは次のとおりです。