compositeは日本語で「複合物」という意味になる.Compositeパターンは,木構造の再帰的なデータを表現するためのパターンである.
ファイルシステムを考えるとわかりやすく,枝がディレクトリ,葉がファイルにあたる.
Compositeパターンの主な要素は以下である.
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を表現したいときにはちょうどいいデザインパターンだと思う.
しかし,それらはあまり汎用的ではないというか,木構造を扱うことはそれほど多いわけではないので,使いどころはあまりなさそう.