设计模式:组合模式

本文介绍了组合模式(CompositePattern),一种用于表示部分-整体层次结构的设计模式,客户端以统一方式处理组件和组合。Java示例展示了如何用图形库应用这一模式,包括组件接口、叶子对象(如矩形和圆形)、组合对象(如组合图形)以及客户端的使用场景。

        组合模式(Composite Pattern)是一种结构型设计模式,它的主要目的是将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。在组合模式中,组合对象和叶子对象都有相同的接口,用户可以以相同的方式处理它们,无需了解对象是单个实体还是由多个对象组成的集合。

组合模式的角色包括:

  1. Component(组件):定义了组合对象和叶子对象共有的接口,声明了所有基本操作,如增加、删除子节点,访问子节点等。

  2. Leaf(叶子):是组合对象中的最底层对象,没有子节点。实现了Component接口,提供了真实的数据或服务。

  3. Composite(组合):包含并管理多个Component对象,可以是Leaf对象或其他Composite对象。它实现了Component接口,提供了附加的管理子元素的方法。

  4. 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();
    }
}

        在这个例子中,RectangleCircle是叶子对象,它们实现了draw()方法但不支持添加或移除其他图形。GraphicGroup则是组合对象,它可以包含多个图形,并且在其draw()方法中递归地绘制其所有成员。在客户端代码中,我们可以统一地对待单个图形和组合图形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值