コンポジットパターンは、構造デザインパターンの一つです。コンポジットデザインパターンは、部分と全体の階層を表現する必要がある場合に使用されます。
コンポジットデザインパターン
特定の構造を作成する必要があり、構造内のオブジェクトを同じように扱う必要がある場合に、コンポジットデザインパターンを適用することができます。現実の例で理解しましょう – ダイアグラムは、円、直線、三角形などのオブジェクトから構成される構造です。描画を色で塗りつぶす(例えば赤色)と、描画内のオブジェクトにも同じ色が適用されます。ここでは、描画は異なる部分で構成され、すべての部分には同じ操作があります。コンポジットパターンには、以下のオブジェクトが含まれます。
- ベースコンポーネント – ベースコンポーネントは、コンポジション内のすべてのオブジェクトを扱うためにクライアントプログラムが使用するインターフェースです。インターフェースまたはすべてのオブジェクトに共通のいくつかのメソッドを持つ抽象クラスであることができます。
- 葉 – 組成要素の動作を定義します。これは構成要素の基本コンポーネントを実装する構築ブロックであり、他のコンポーネントへの参照はありません。
- 複合 – 葉要素で構成され、基本コンポーネントで操作を実装します。
ここでは、描画シナリオに対して複合設計パターンを適用しています。
複合パターン基本コンポーネント
複合パターン基本コンポーネントは、葉と複合の共通メソッドを定義します。メソッドdraw(String fillColor)
を持つShape
クラスを作成できます。 形状を指定された色で描画します。Shape.java
package com.journaldev.design.composite;
public interface Shape {
public void draw(String fillColor);
}
複合設計パターンの葉オブジェクト
複合設計パターンの葉は基本コンポーネントを実装し、これらは複合の構築ブロックです。 三角形、円など、複数の葉オブジェクトを作成できます。 Triangle.java
package com.journaldev.design.composite;
public class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color "+fillColor);
}
}
Circle.java
package com.journaldev.design.composite;
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color "+fillColor);
}
}
複合オブジェクト
A composite object contains group of leaf objects and we should provide some helper methods to add or delete leafs from the group. We can also provide a method to remove all the elements from the group. Drawing.java
package com.journaldev.design.composite;
import java.util.ArrayList;
import java.util.List;
public class Drawing implements Shape{
//シェイプの集合
private List shapes = new ArrayList();
@Override
public void draw(String fillColor) {
for(Shape sh : shapes)
{
sh.draw(fillColor);
}
}
//描画にシェイプを追加する
public void add(Shape s){
this.shapes.add(s);
}
//描画からシェイプを削除する
public void remove(Shape s){
shapes.remove(s);
}
//すべてのシェイプを削除する
public void clear(){
System.out.println("Clearing all the shapes from drawing");
this.shapes.clear();
}
}
コンポジットは、コンポーネントを実装し、リーフと同様に振る舞いますが、リーフ要素のグループを含むことができます。コンポジットパターンの実装は完了し、クライアントプログラムでテストできます。
コンポジットデザインパターンのクライアントプログラム
TestCompositePattern.java
package com.journaldev.design.test;
import com.journaldev.design.composite.Circle;
import com.journaldev.design.composite.Drawing;
import com.journaldev.design.composite.Shape;
import com.journaldev.design.composite.Triangle;
public class TestCompositePattern {
public static void main(String[] args) {
Shape tri = new Triangle();
Shape tri1 = new Triangle();
Shape cir = new Circle();
Drawing drawing = new Drawing();
drawing.add(tri1);
drawing.add(tri1);
drawing.add(cir);
drawing.draw("Red");
drawing.clear();
drawing.add(tri);
drawing.add(cir);
drawing.draw("Green");
}
}
上記のコンポジットパターンのクライアントプログラムの出力は次のとおりです:
Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Clearing all the shapes from drawing
Drawing Triangle with color Green
Drawing Circle with color Green
コンポジットパターンの重要なポイント
- コンポジットパターンは、オブジェクトのグループが1つのオブジェクトとして振る舞う必要がある場合にのみ適用されるべきです。
- コンポジットデザインパターンは、ツリー状の構造を作成するために使用することができます。
java.awt.Container#add(Component)
は、Javaでのコンポジットパターンの優れた例であり、Swingでよく使用されています。以前の構造デザインパターンの記事:
Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java