
设计模式之组合模式
什么是组合模式
组合模式是结构设计模式之一。 当我们必须表示部分整个层次时,将使用组合设计模式。
组合模式是结构设计模式之一。 当我们必须表示部分整个层次时,将使用组合设计模式。
让我们用一个真实的例子来理解它–图表是由诸如圆形,直线,三角形等对象组成的结构。当我们用颜色(例如红色)填充图形时,相同的颜色也将应用于对象中。 画画。 在这里,绘图由不同的部分组成,它们都具有相同的操作。
组合模式包含以下对象:
- Base Component:基本组件是合成中所有对象的接口,客户端程序使用基本组件来处理合成中的对象。 它可以是接口,也可以是抽象类,并且所有对象都可以使用某些方法。
- Leaf:定义组合中元素的行为。 它是构成的基础,并实现了基本组件。 它没有引用其他组件。
- Composite:它由叶元素组成,并在基本组件中实现操作。
在这里,我正在为绘图方案应用组合设计模式。
组合设计模式基础组件
组合模式基础组件定义了叶子和组合材料的常用方法。 我们可以使用draw(String fillColor
)方法创建一个Shape
类,以使用给定的颜色绘制形状。
Shape.java
1 2 3
| public interface Shape { void draw(String fillColor); }
|
组合设计模式叶对象
组合设计模式叶实现了基础组件,而这些是组合的基础。 我们可以创建多个叶子对象,例如Triangle,Circle等。
Triangle.java
1 2 3 4 5 6
| public class Triangle implements Shape { @Override public void draw(String fillColor) { System.out.println("Drawing Triangle with color " + fillColor); } }
|
Circle.java
1 2 3 4 5 6
| public class Circle implements Shape { @Override public void draw(String fillColor) { System.out.println("Drawing Circle with color " + fillColor); } }
|
组合模式对象
一个组合对象包含一组叶子对象,我们应该提供一些辅助方法来从该组中添加或删除叶子。 我们还可以提供一种从组中删除所有元素的方法。
Drawing.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import java.util.ArrayList; import java.util.List;
public class Drawing implements Shape {
private List<Shape> shapes = new ArrayList<>();
@Override public void draw(String fillColor) { for (Shape shape : shapes) { shape.draw(fillColor); } }
public void add(Shape shape) { this.shapes.add(shape); }
public void remove(Shape shape) { this.shapes.remove(shape); }
public void clear() { System.out.println("Clearing all the shapes from drawing."); this.shapes.clear(); } }
|
请注意,Composite
也实现了component
,并且行为类似于leaf,只是它可以包含一组leaf元素。
组合模式类图

我们的组合模式实现已准备就绪,我们可以使用客户端程序对其进行测试。
组合设计模式客户程序
TestCompositePattern.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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"); } }
|
上述组合模式客户端程序的输出为:
1 2 3 4 5 6
| 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中Composite
模式的一个很好的例子,在Swing中使用了很多。