📜  设计模式-复合模式(1)

📅  最后修改于: 2023-12-03 15:12:08.642000             🧑  作者: Mango

设计模式-复合模式

简介

复合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表现“整体/部分”层次结构。复合能让客户端以一致的方式处理个别对象以及对象组合。

类图

Composite Pattern Class Diagram

角色
  • Component:定义组合中对象的接口,声明了类共有接口的默认行为,可以有一个对父组件的操作。

  • Leaf:在组合中表示叶子结点对象,叶子结点没有子结点。

  • Composite:定义有子结点的那些组件的行为,存储子组件,在 Component 接口中实现与子组件有关的操作。

代码示例
public interface Component {
    void operation();
    void add(Component component);
    void remove(Component component);
    Component getChild(int index);
}

public class Leaf implements Component {
    @Override
    public void operation() {
        // do something
    }

    @Override
    public void add(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Component getChild(int index) {
        throw new UnsupportedOperationException();
    }
}

public class Composite implements Component {
    private List<Component> children = new ArrayList<>();

    @Override
    public void operation() {
        for (Component component : children) {
            component.operation();
        }
    }

    @Override
    public void add(Component component) {
        children.add(component);
    }

    @Override
    public void remove(Component component) {
        children.remove(component);
    }

    @Override
    public Component getChild(int index) {
        return children.get(index);
    }
}
应用场景

当你发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时就可以使用复合模式。

复合模式在 GUI 中尤为常见,例如,一个 GUI 界面中常常包含了嵌套的面板和控件。像这样的界面,当用户进行操作(如点击一个按钮)时,其实是将整个 GUI 界面作为一个整体来处理的。

优缺点
优点
  • 客户端可以一致地对待单个对象和组合对象,无需关心对象的具体类别。

  • 增加新的组件类很容易,符合开放封闭原则。

  • 通过递归实现对组合对象的操作,客户端可以不断地递归下去,而不用关心组合对象的具体实现。

缺点
  • 复合模式可能会使设计过度一般化。

  • 在使用复合模式时,对叶子节点和容器节点的处理方法有所不同,增加了代码实现的理解难度和代码复杂度。

总结

复合模式是一种将对象组合成树形结构来表示 “整体 / 部分” 层次结构的模式。这种模式创建了一个包含了自己对象组的类。该类提供了修改相同对象组的方式。这种类型的设计模式属于结构型模式,它通过一种类似于树的结构实现了对对象的组合。

参考资料