深入解析Java组合设计模式:原理与实战应用
这是文章《Java中的组合设计模式》的第1部分(共1部分)。
内容片段: 组合模式是结构性设计模式之一。当我们需要表示一个部分-整体层次结构时,会使用组合设计模式。
组合设计模式
当我们需要以某种方式创建一个结构,该结构中的对象必须以相同的方式进行处理时,我们可以应用组合设计模式。让我们用一个现实生活的例子来理解它——图表是由圆形、线条、三角形等对象组成的结构。当我们用颜色(比如红色)填充图表时,相同的颜色也被应用到图表中的对象上。这里的图表由不同的部分组成,它们都具有相同的操作。组合模式包括以下对象。
- 基本组件 – 基本组件是构成所有对象的接口,客户程序使用基本组件来处理组合中的对象。它可以是一个接口或一个抽象类,其中包含一些对于所有对象都通用的方法。
- 叶节点 – 定义组合中元素的行为。它是组合的基本构建块,并实现基本组件。它没有对其他组件的引用。
- 组合 – 由叶节点元素组成,并实现基本组件的操作。
在这里,我正在为绘画场景应用组合设计模式。
复合模式基本组件
组合模式的基本组件为叶节点和复合节点定义了共有的方法。我们可以创建一个类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("用颜色 "+fillColor+" 绘制三角形");
}
}
Circle.java
package com.Olivia.design.composite;
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("用颜色 "+fillColor+" 绘制圆形");
}
}
复合对象
一个复合对象包含了一组叶子对象,并且我们应该提供一些帮助方法来添加或删除组中的叶子。我们也可以提供一个方法来移除组中的所有元素。Drawing.java。
package com.Olivia.design.composite;
import java.util.ArrayList;
import java.util.List;
public class Drawing implements Shape{
// 形状的集合
private List<Shape> shapes = new ArrayList<Shape>();
@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("从绘图中清除所有形状");
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("红色");
drawing.clear();
drawing.add(tri);
drawing.add(cir);
drawing.draw("绿色");
}
}
上述组合模式客户端程序的输出结果是:
用颜色 红色 绘制三角形
用颜色 红色 绘制三角形
用颜色 红色 绘制圆形
从绘图中清除所有形状
用颜色 绿色 绘制三角形
用颜色 绿色 绘制圆形
复合模式要点
- 只有当一组对象应该作为单个对象运行时,才应该应用组合模式。
- 组合设计模式可用于创建树状结构。
Java的java.awt.Container#add(Component)是Java中组合模式的一个很好的例子,并且在Swing中被广泛使用。之前的结构设计模式文章如下:
- Java中的桥接模式
- Java中的适配器设计模式