组合模式(Composite Pattern)是一种结构型设计模式,它的主要目的是将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。在组合模式中,组合对象和叶子对象都有相同的接口,用户可以以相同的方式处理它们,无需了解对象是单个实体还是由多个对象组成的集合。
组合模式的角色包括:
-
Component(组件):定义了组合对象和叶子对象共有的接口,声明了所有基本操作,如增加、删除子节点,访问子节点等。
-
Leaf(叶子):是组合对象中的最底层对象,没有子节点。实现了
Component接口,提供了真实的数据或服务。 -
Composite(组合):包含并管理多个
Component对象,可以是Leaf对象或其他Composite对象。它实现了Component接口,提供了附加的管理子元素的方法。 -
Client(客户端):通过
Component接口与组合对象或叶子对象交互,无须关心当前操作的对象是叶子对象还是组合对象。
组合模式的主要优点如下:
- 它能让客户以一致的方式处理单个对象和组合对象,简化了客户端代码。
- 它容易在组合体内加入新的对象,客户端代码无需改变。
- 它促进了递归数据结构的实现。
组合模式的适用场景包括文件系统、组织结构、DOM(Document Object Model)树结构等。
下面是一个简单的Java实现,展示了组合模式的基本结构。这里我们创建一个图形库应用程序,其中图形既可以是简单图形(叶子对象),如矩形和圆形,也可以是复杂图形(组合对象),如组合图形,它包含多个图形。
// Component 接口
interface GraphicObject {
void draw();
void add(GraphicObject graphicObject);
void remove(GraphicObject graphicObject);
}
// Leaf 类 - 矩形
class Rectangle implements GraphicObject {
private String color;
public Rectangle(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("Drawing a rectangle with color: " + color);
}
// 叶子对象不支持添加或移除子对象,因此这些方法可以抛出异常或者留空
@Override
public void add(GraphicObject graphicObject) {
throw new UnsupportedOperationException("Rectangle cannot have children.");
}
@Override
public void remove(GraphicObject graphicObject) {
throw new UnsupportedOperationException("Rectangle cannot remove children.");
}
}
// Leaf 类 - 圆形
class Circle implements GraphicObject {
private String color;
public Circle(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("Drawing a circle with color: " + color);
}
@Override
public void add(GraphicObject graphicObject) {
throw new UnsupportedOperationException("Circle cannot have children.");
}
@Override
public void remove(GraphicObject graphicObject) {
throw new UnsupportedOperationException("Circle cannot remove children.");
}
}
// Composite 类 - 组合图形
class GraphicGroup implements GraphicObject {
private List<GraphicObject> objects = new ArrayList<>();
@Override
public void draw() {
for (GraphicObject object : objects) {
object.draw();
}
}
@Override
public void add(GraphicObject graphicObject) {
objects.add(graphicObject);
}
@Override
public void remove(GraphicObject graphicObject) {
objects.remove(graphicObject);
}
}
// Client 示例
public class Client {
public static void main(String[] args) {
GraphicObject rectangle = new Rectangle("Red");
GraphicObject circle = new Circle("Blue");
GraphicObject group = new GraphicGroup();
group.add(rectangle);
group.add(circle);
rectangle.draw();
circle.draw();
group.draw();
// 添加更多的图形到组合中
GraphicObject anotherCircle = new Circle("Green");
group.add(anotherCircle);
group.draw();
}
}
在这个例子中,Rectangle和Circle是叶子对象,它们实现了draw()方法但不支持添加或移除其他图形。GraphicGroup则是组合对象,它可以包含多个图形,并且在其draw()方法中递归地绘制其所有成员。在客户端代码中,我们可以统一地对待单个图形和组合图形。
本文介绍了组合模式(CompositePattern),一种用于表示部分-整体层次结构的设计模式,客户端以统一方式处理组件和组合。Java示例展示了如何用图形库应用这一模式,包括组件接口、叶子对象(如矩形和圆形)、组合对象(如组合图形)以及客户端的使用场景。

被折叠的 条评论
为什么被折叠?



