複合パターンは、オブジェクトをツリー構造に結合して部分全体の階層を表現できる構造設計パターンです。合成パターンにより、クライアントは単一オブジェクトと複合オブジェクトを一貫した方法で処理できるようになります。複合モードには、リーフ ノード (Leaf) とコンテナ ノード (Composite) という 2 つの重要な役割があります。
以下は、合成パターンを実装する方法を示す簡単な Java の例です。
Component
まず、コンポジション内のすべてのオブジェクトの共通インターフェイスを表す抽象クラスを定義します。
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
public abstract void operation();
}
Leaf
次に、以下を継承するリーフ ノード クラスを作成しますComponent
。
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void operation() {
System.out.println("Leaf " + name + " is performing an operation");
}
}
次に、コンテナ ノード クラス を作成しますComposite
。これも他のコンポーネントを継承しComponent
、他のコンポーネントを含めることができます。
import java.util.ArrayList;
import java.util.List;
public class Composite extends Component {
private List<Component> children = new ArrayList<>();
public Composite(String name) {
super(name);
}
@Override
public void operation() {
System.out.println("Composite " + name + " is performing an operation");
for (Component child : children) {
child.operation();
}
}
public void add(Component component) {
children.add(component);
}
public void remove(Component component) {
children.remove(component);
}
}
これで、リーフ ノードとコンテナ ノードを含む複合構造を作成し、複合パターンを通じてそれらを処理できるようになります。
public class CompositePatternDemo {
public static void main(String[] args) {
Component leaf1 = new Leaf("Leaf 1");
Component leaf2 = new Leaf("Leaf 2");
Component leaf3 = new Leaf("Leaf 3");
Composite composite1 = new Composite("Composite 1");
composite1.add(leaf1);
composite1.add(leaf2);
Composite composite2 = new Composite("Composite 2");
composite2.add(leaf3);
Composite root = new Composite("Root");
root.add(composite1);
root.add(composite2);
root.operation();
}
}
この例では、リーフ ノードとコンテナ ノードを含む複合構造を作成します。Composite パターンを使用すると、個々のリーフ ノードと複合コンテナ ノードを一貫した方法で処理できます。呼び出しでは、各ノードのメソッドがroot.operation()
再帰的に呼び出され、結合された構造全体の操作が実装されます。operation()
複合パターンは、ファイル システムや組織構造など、単一のオブジェクトと結合されたオブジェクトを一貫した方法で処理する必要があるシナリオに適しています。これにより、クライアント コードがより柔軟になり、複雑なオブジェクト構造を再帰的に処理できるようになります。