组合模式
组合模式(Composite模式)属于结构型模式的一种。
组合模式将对象组合成树形结构以表示部分-整体的层次结构。通过组合模式,可以统一处理单个对象和对象集合,简化了对复杂树形结构的操作。
组合模式适用于需要将对象以树形结构组织的场景。文件系统中的文件和文件夹就是一个典型的使用场景。文件可以看作是叶子节点,文件夹可以包含多个文件或其他文件夹,从而形成层次结构。
组合模式以递归方式处理对象树中的所有项目。使用组合模式时,应确保应用的核心模型能够以树状结构表示。
组合模式通常有以下组成部分:
- 组件接口:定义了所有具体对象和组合对象的共同接口。
- 叶子节点:实现了组件接口的具体对象,表示树形结构中的叶子节点。叶子节点最终会完成大部分的实际工作。
- 组合节点:也实现了组件接口,可以包含叶子节点和其他组合节点。
使用组合模式实现一个图形绘制的应用,其中包含不同类型的形状。
1、组件接口
// 组件接口
interface Shape {
void draw();
}
2、叶子节点
// 叶子节点
class Circle implements Shape {
public void draw() {
System.out.println("Drawing a Circle");
}
}
class Square implements Shape {
public void draw() {
System.out.println("Drawing a Square");
}
}
3、组合节点
// 组合节点
class CompositeShape implements Shape {
private List<Shape> shapes = new ArrayList<>();
public void add(Shape shape) {
shapes.add(shape);
}
public void remove(Shape shape) {
shapes.remove(shape);
}
public void draw() {
for (Shape shape : shapes) {
shape.draw();
}
}
}
4、客户端
// 使用组合模式
public class Main {
public static void main(String[] args) {
Shape circle1 = new Circle();
Shape circle2 = new Circle();
Shape square1 = new Square();
CompositeShape compositeShape = new CompositeShape();
compositeShape.add(circle1);
compositeShape.add(square1);
compositeShape.add(circle2);
compositeShape.draw(); // 输出: Drawing a Circle, Drawing a Square, Drawing a Circle
}
}
组合模式的优缺点。
优点:
- 清晰的层次结构:通过树形结构,能够清晰地表示对象之间的关系。
- 灵活性:组合模式支持动态增加或删除组合对象,便于扩展和修改。
缺点:
- 不易限制:组合模式允许无限制地组合对象,可能会导致设计上的灵活性变得难以控制。
组合模式可以帮助我们更好地处理复杂对象关系,提高代码的可读性和可维护性。
可以在创建复杂组合树时使用生成器模式,这样可以使其构造步骤以递归的方式运行。
杀不死我的,终将使我强大。-- 烟沙九洲