Java中的组合设计模式
组合模式是结构性设计模式之一。当我们需要表示一个部分-整体层次结构时,会使用组合设计模式。
组合设计模式
当我们需要以某种方式创建一个结构,该结构中的对象必须以相同的方式进行处理时,我们可以应用组合设计模式。让我们用一个现实生活的例子来理解它——图表是由圆形、线条、三角形等对象组成的结构。当我们用颜色(比如红色)填充图表时,相同的颜色也被应用到图表中的对象上。这里的图表由不同的部分组成,它们都具有相同的操作。组合模式包括以下对象。
-
- 基本组件 – 基本组件是构成所有对象的接口,客户程序使用基本组件来处理组合中的对象。它可以是一个接口或一个抽象类,其中包含一些对于所有对象都通用的方法。
-
- 叶节点 – 定义组合中元素的行为。它是组合的基本构建块,并实现基本组件。它没有对其他组件的引用。
- 组合 – 由叶节点元素组成,并实现基本组件的操作。
在这里,我正在为绘画场景应用组合设计模式。
复合模式基本组件
组合模式的基本组件为叶节点和复合节点定义了共有的方法。我们可以创建一个类Shape,并拥有一个方法draw(String fillColor),来用给定的颜色绘制形状。Shape.java。
package com.Olivia.design.composite;
public interface Shape {
public void draw(String fillColor);
}
组合设计模式的叶子对象
组合设计模式的叶子类实现了基本组件,这些是构成复合对象的基本单位。我们可以创建多个叶子对象,比如Triangle(三角形),Circle(圆形)等。Triangle.java。
package com.Olivia.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.Olivia.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.Olivia.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.Olivia.design.test;
import com.Olivia.design.composite.Circle;
import com.Olivia.design.composite.Drawing;
import com.Olivia.design.composite.Shape;
import com.Olivia.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)是java中组合模式的一个很好的例子,并且在Swing中被广泛使用。之前的结构设计模式文章如下:
- Bridge Pattern in Java
- Adapter Design Pattern in Java