神的孩子都在歌唱

神的孩子都在歌唱

一. 介绍

组合模式应用:

  • 仅当对象组应表现为单个对象时才应应用组合模式。
  • 组合设计模式可用于创建树状结构。

组合模式主要包含三种角色:

  • Component:定义系统各层次对象的共有方法和属性,它可以是一个接口或一个抽象类,可以预先定义一些默认行为和属性。
  • Leaf:定义合成中元素的行为。它是组合和实现基本对象的构建块。它没有对其他对象的引用
  • Composite: 它由各个子对象(leaf元素)组成,并在基本组件中实现操作。

比如图表是一种由圆形、三角形等对象组成的结构。当我们为图表填充颜色时,填充的颜色也会作用到图表中的每个对象。图表中的对象都有相同操作,那就是填充颜色。

二.代码示例

结构设计模式 - 组合设计模式 - JAVA-LMLPHP

2.1 定义Component

/**
 * 图形
 *
 * @author chenyunzhi
 * @date 2024/3/11 22:55
 */
public interface Graph {

    /**
     * 填充颜色
     * @param color 颜色
     */
    void fillColor(String color);
}

2.2 定义Leaf

圆形对象

/**
 * 圆形
 *
 * @author chenyunzhi
 * @date 2024/3/11 22:58
 */
public class Circle implements Graph{
    @Override
    public void fillColor(String color) {
        System.out.println("给圆形填充了" + color);
    }
}

三角形对象

/**
 * 三角形
 *
 * @author chenyunzhi
 * @date 2024/3/11 22:56
 */
public class Triangle implements Graph{
    @Override
    public void fillColor(String color) {
        System.out.println("给三角形填充了" + color);
    }
}

2.3 定义Composite

/**
 * 图表
 *
 * @author chenyunzhi
 * @date 2024/3/11 23:00
 */
public class Diagram implements Graph{

    private final List<Graph> graphs;

    public Diagram(List<Graph> graphs) {
        this.graphs = graphs;
    }

    @Override
    public void fillColor(String color) {
        for (Graph graph:graphs) {
            graph.fillColor(color);
        }
    }

    /**
     * 添加图形
     */
    public void add(Graph graph) {
        graphs.add(graph);
    }

    /**
     * 删除图形
     */
    public void delete(Graph graph) {
        graphs.remove(graph);
    }
 }

三. 参考案例

  • java.awt.Container#add(Component)是 Java 中组合模式的一个很好的例子,并且在 Swing 中大量使用。
03-15 13:02