Javaでのコンポジットデザインパターン
コンポジットパターンは、構造デザインパターンの一つです。コンポジットデザインパターンは、部分と全体の階層を表現する必要がある場合に使用されます。
コンポジットデザインパターン
同じ方法で構造内のオブジェクトを処理する必要がある場合には、コンポジットデザインパターンを適用することができます。実際の例で理解しましょう – ダイアグラムは、円、直線、三角形などのオブジェクトから構成される構造です。描画を色(たとえば赤)で塗りつぶすと、同じ色が描画のオブジェクトにも適用されます。ここでは、描画は異なる部分で構成されており、すべての部分には同じ操作があります。コンポジットパターンには、以下のオブジェクトが含まれています。
-
- ベースコンポーネント – ベースコンポーネントは、構成内のすべてのオブジェクトのインターフェースです。クライアントプログラムはベースコンポーネントを使用して構成内のオブジェクトと連携します。インターフェースまたはすべてのオブジェクトに共通のいくつかのメソッドを持つ抽象クラスであることがあります。
-
- リーフ – 構成内の要素の動作を定義します。構成の構築要素であり、ベースコンポーネントを実装しています。他のコンポーネントへの参照はありません。
- コンポジット – リーフ要素から構成され、ベースコンポーネントの操作を実装します。
私はここで、描画シナリオに合わせてコンポジットデザインパターンを適用しています。
コンポジットパターンの基底コンポーネント
コンポジットパターンのベースコンポーネントは、リーフとコンポジットのための共通メソッドを定義します。私たちは、指定された色で形状を描画するためのメソッドであるdraw(String fillColor)を持つShapeクラスを作成することができます。Shape.java
package com.scdev.design.composite;
public interface Shape {
public void draw(String fillColor);
}
コンポジットデザインパターンのリーフオブジェクト
複合デザインパターンのLeafは、ベースコンポーネントを実装し、これらはコンポジットの構築要素です。Triangle、Circleなどの複数のLeafオブジェクトを作成することができます。Triangle.java
package com.scdev.design.composite;
public class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color "+fillColor);
}
}
サークル.java
package com.scdev.design.composite;
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color "+fillColor);
}
}
複合物
複合オブジェクトには複数の葉オブジェクトが含まれており、グループから葉を追加または削除するためのヘルパーメソッドを提供する必要があります。また、グループからすべての要素を削除するメソッドも提供することができます。Drawing.java
package com.scdev.design.composite;
import java.util.ArrayList;
import java.util.List;
public class Drawing implements Shape{
//collection of Shapes
private List<Shape> shapes = new ArrayList<Shape>();
@Override
public void draw(String fillColor) {
for(Shape sh : shapes)
{
sh.draw(fillColor);
}
}
//adding shape to drawing
public void add(Shape s){
this.shapes.add(s);
}
//removing shape from drawing
public void remove(Shape s){
shapes.remove(s);
}
//removing all the shapes
public void clear(){
System.out.println("Clearing all the shapes from drawing");
this.shapes.clear();
}
}
コンポジットもコンポーネントを実装し、リーフと同様に振る舞いますが、複数のリーフ要素を含むことができることに留意してください。私たちのコンポジットパターンの実装は準備ができており、クライアントプログラムでテストすることができます。
コンポジットデザインパターンのクライアントプログラム
テストCompositePattern.java
package com.scdev.design.test;
import com.scdev.design.composite.Circle;
import com.scdev.design.composite.Drawing;
import com.scdev.design.composite.Shape;
import com.scdev.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
コンポジットパターンの重要なポイント
- Composite pattern should be applied only when the group of objects should behave as the single object.
- Composite design pattern can be used to create a tree like structure.
Javaのjava.awt.Container#add(Component)は、Compositeパターンの素晴らしい例であり、Swingでよく使用されています。以前の構造デザインパターンの記事:
- Bridge Pattern in Java
- Adapter Design Pattern in Java