组合模式(Composite Pattern)
组合模式(Composite Pattern)
组合模式是一种结构型设计模式,它将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,客户端可以统一地处理单个对象和组合对象。
模式结构
- 组件接口(Component)
定义组合模式中所有对象的公共接口,声明对象拥有的公共方法。 - 叶子节点(Leaf)
实现组件接口,表示组合中的叶子节点,不包含任何子组件。 - 复合对象(Composite)
实现组件接口,并包含一组子组件(可以是叶子节点或其他复合对象)。复合对象负责将操作委托给其子组件。
代码示例
1. 组件接口(Component)
// 组件接口:定义组合模式中所有对象的公共接口
interface Shape {
void draw(String fillColor);
}
2. 叶子节点(Leaf)
// 叶子节点:三角形
class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color : " + fillColor);
}
}
// 叶子节点:圆形
class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color : " + fillColor);
}
}
3. 复合对象(Composite)
// 复合对象:绘画
class Drawing implements Shape {
private final List<Shape> shapes = new ArrayList<>();
@Override
public void draw(String fillColor) {
for (Shape shape : shapes) {
shape.draw(fillColor);
}
}
// 添加形状
public void add(Shape shape) {
shapes.add(shape);
}
// 移除形状
public void remove(Shape shape) {
shapes.remove(shape);
}
// 清空所有形状
public void clear() {
System.out.println("Clearing all the shapes from drawing");
shapes.clear();
}
}
4.调用示例
public class CompositePattern {
public static void main(String[] args) {
// 创建叶子节点
Shape triangle = new Triangle();
Shape circle = new Circle();
// 创建复合对象
Drawing drawing = new Drawing();
drawing.add(triangle);
drawing.add(circle);
// 绘制所有形状
drawing.draw("pink");
// 清空并重新添加形状
drawing.clear();
drawing.add(triangle);
drawing.draw("blue");
}
}
输出结果
Drawing Triangle with color : pink
Drawing Circle with color : pink
Clearing all the shapes from drawing
Drawing Triangle with color : blue
应用场景
- 树状对象结构
当需要实现树状对象结构时,可以使用组合模式。组合模式为使用者提供了两种共享公共接口的基本元素类型:叶节点和组合。 - 部分-整体层次结构
当需求中体现部分与整体层次的结构时,或希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,可以考虑使用组合模式。
优缺点
优点
- 统一处理
组合模式使得客户端可以统一地处理单个对象和组合对象,简化了客户端代码。 - 扩展性
无需更改已有的代码,就可以在应用中添加新对象,使其成为树结构的一部分。 - 灵活性
可以利用多态和递归的机制,更方便地使用复杂的树形结构。
缺点
- 接口设计困难
对于功能差异较大的类,提供公共接口比较困难。 - 复杂性增加
组合模式引入了额外的类和接口,增加了代码的复杂性。
总结
组合模式通过将对象组合成树形结构,使得客户端可以统一地处理单个对象和组合对象。它适用于需要实现树状对象结构或部分-整体层次结构的场景。尽管它可能会增加代码的复杂性,但其优点在于提高了代码的灵活性和可扩展性。组合模式在需要处理树形结构的场景中非常有用。