組合模式是結構型設計模式之一。當我們需要表示部分-整體層次結構時,可以使用組合設計模式。
組合設計模式
當我們需要以一種方式創建結構,使得結構中的對象必須以相同的方式處理時,可以應用組合設計模式。讓我們通過一個現實生活中的例子來理解它-一個圖表是一個由圓圈、線條、三角形等對象組成的結構。當我們將圖表填充顏色(比如紅色)時,相同的顏色也應用到圖表中的對象上。這裡的圖表由不同的部分組成,它們都具有相同的操作。組合模式由以下對象組成。
- 基本組件 – 基本組件是組合中所有對象的接口,客戶端程序使用基本組件與組合中的對象進行交互。它可以是一個接口或一個帶有一些對所有對象通用的方法的抽象類。
- 葉子 – 定義構成元素的行為。它是構成的基本單元,實現基本組件。它不包含對其他組件的引用。
- 組合體 – 它包含葉子元素,並實現基本組件中的操作。
在這裡,我正在應用組合設計模式來處理繪圖場景。
組合模式基本組件
組合模式基本組件定義了葉子和組合體的共同方法。我們可以創建一個名為Shape
的類,並使用draw(String fillColor)
方法以給定的顏色繪製形狀。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
複合模式重要要點
- 只有在對象組應該作為單個對象行為時,才應該應用複合模式。
- 複合設計模式可用於創建類似樹狀結構。
java.awt.Container#add(Component)
是Java中複合模式的一個很好的例子,並且在Swing中被廣泛使用。早期的結構設計模式文章:
Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java