代码语言:javascript复制
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle");
}
}
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a triangle");
}
}
public 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);
}
@Override
public void draw() {
for (Shape shape : shapes) {
shape.draw();
}
}
}
public class CompositeDemo {
public static void main(String[] args) {
Circle circle = new Circle();
Rectangle rectangle = new Rectangle();
Triangle triangle = new Triangle();
CompositeShape compositeShape = new CompositeShape();
compositeShape.add(circle);
compositeShape.add(rectangle);
CompositeShape finalShape = new CompositeShape();
finalShape.add(compositeShape);
finalShape.add(triangle);
finalShape.draw();
}
}
在上述示例中,我们定义了 Shape 接口,它是所有形状的抽象接口。然后我们实现了三个具体的形状:Circle、Rectangle 和 Triangle。这些具体的形状都实现了 Shape 接口,并实现了 draw() 方法来绘制自己。
接下来我们定义了一个 CompositeShape 类,它也实现了 Shape 接口,但它可以包含其他的 Shape 对象。它有 add() 和 remove() 方法来添加或删除 Shape 对象,并且它的 draw() 方法会递归地调用所有包含的 Shape 对象的 draw() 方法。
最后,我们在 CompositeDemo 类中创建了一个组合图形,它包含了一个 CompositeShape(包含 Circle 和 Rectangle)和一个 Triangle。当我们调用 finalShape 的 draw() 方法时,它会递归地调用所有子形状的 draw() 方法,从而绘制整个组合图形。
在实际应用中,组合模式可以应用在很多场景中,比如处理文件系统、图形界面、菜单、树形结构等等。它能够帮助我们更加方便地处理复杂的对象或数据结构,同时也提高了代码的可重用性和可扩展性。