设计模式-组合模式示例

2023-05-04 14:11:42 浏览数 (1)

代码语言: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() 方法,从而绘制整个组合图形。

在实际应用中,组合模式可以应用在很多场景中,比如处理文件系统、图形界面、菜单、树形结构等等。它能够帮助我们更加方便地处理复杂的对象或数据结构,同时也提高了代码的可重用性和可扩展性。

0 人点赞