Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [⑪ Composite]

概要

compositeは日本語で「複合物」という意味になる.Compositeパターンは,木構造の再帰的なデータを表現するためのパターンである.

ファイルシステムを考えるとわかりやすく,枝がディレクトリ,葉がファイルにあたる.

Compositeパターンの主な要素は以下である.

  • Component:枝と葉に共通するインターフェース
  • Leaf:木構造における葉を表す,Componentインターフェースを実装したクラス
  • Composite:木構造における枝を表す,Componentインターフェースを実装したクラス.

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

javaimport java.util.ArrayList;
import java.util.List;

// Component
interface Component {
    void operation();
}

// Leaf
class LeafA implements Component {
    @Override
    public void operation() {
        System.out.println("LeafA operation");
    }
}

class LeafB implements Component {
    @Override
    public void operation() {
        System.out.println("LeafB operation");
    }
}

// Composite
class Composite implements Component {
    private String name;
    private List<Component> children = new ArrayList<>();

    public Composite(String name) {
        this.name = name;
    }
    public void add(Component component) {
        children.add(component);
    }
    public void remove(Component component) {
        children.remove(component);
    }
    @Override
    public void operation() {
        System.out.println(name + " operation");
        for (Component component : children) {
            component.operation();
        }
    }
}

// Client
public class CompositePattern {
    public static void main(String[] args) {
        Component leafA = new LeafA();
        Component leafB = new LeafB();
        Composite compositeX = new Composite("compositeX");
        Composite compositeY = new Composite("compositeY");
        compositeX.add(leafA);
        compositeX.add(leafB);
        compositeY.add(leafA);
        compositeY.add(leafB);
        compositeX.add(compositeY);
        compositeX.operation();
    }
}

まとめ,所感

ファイルシステムやDOMを表現したいときにはちょうどいいデザインパターンだと思う.

しかし,それらはあまり汎用的ではないというか,木構造を扱うことはそれほど多いわけではないので,使いどころはあまりなさそう.