欢迎来到设计模式系列的第九篇文章!在之前的文章中,我们已经学习了许多重要的设计模式,今天我们将继续探讨另一个有趣且实用的设计模式——组合模式。
组合模式简介
组合模式是一种结构型设计模式,它将对象组合成树状结构以表示“整体-部分”关系。组合模式使得客户端可以以一致的方式处理单个对象和对象组合,从而使得系统更加灵活。
为什么需要组合模式?
在现实世界中,许多对象都具有树状结构的关系,如公司的组织架构、文件系统的目录结构等。使用组合模式,我们可以将这种树状结构的关系以一种统一的方式进行处理。
组合模式的实现
为了更好地理解组合模式,让我们通过一个例子来演示其实际应用。假设我们正在开发一个图形绘制应用,应用可以绘制不同类型的图形,包括基本图形和组合图形。我们可以使用组合模式来构建图形的树状结构。
首先,我们定义一个通用的抽象类 Shape
,表示图形:
public abstract class Shape {
public abstract void draw();
}
然后,我们创建具体的基本图形类,如 Circle
和 Rectangle
:
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
接下来,我们定义一个抽象类 CompositeShape
,表示组合图形:
import java.util.ArrayList;
import java.util.List;
public abstract class CompositeShape extends Shape {
private List<Shape> shapes = new ArrayList<>();
public void addShape(Shape shape) {
shapes.add(shape);
}
@Override
public void draw() {
for (Shape shape : shapes) {
shape.draw();
}
}
}
然后,我们创建具体的组合图形类,如 Group
:
public class Group extends CompositeShape {
@Override
public void draw() {
System.out.println("绘制组合图形");
super.draw();
}
}
在客户端代码中,我们可以使用组合模式来构建图形的树状结构:
public class DrawingClient {
public static void main(String[] args) {
Shape circle = new Circle();
Shape rectangle = new Rectangle();
Group group = new Group();
group.addShape(circle);
group.addShape(rectangle);
group.draw();
}
}
看过上一篇文章"桥接模式"的老铁,可能会发现,组合模式和桥接模式的实现方式,都使用了面向对象思想中的组合,而且在面向对象思想中,我们也提倡:组合优于继承。通过这两种设计模式的学习,想必你对组合会有更加深刻的理解。
总结
组合模式是一种非常实用的设计模式,它可以帮助我们构建树状结构的对象,并以一种统一的方式处理单个对象和对象组合。通过一个图形绘制应用的例子,我们学习了如何使用组合模式来实现整体-部分关系。