一. 介绍
组合模式应用:
- 仅当对象组应表现为单个对象时才应应用组合模式。
- 组合设计模式可用于创建树状结构。
组合模式主要包含三种角色:
- Component:定义系统各层次对象的共有方法和属性,它可以是一个接口或一个抽象类,可以预先定义一些默认行为和属性。
- Leaf:定义合成中元素的行为。它是组合和实现基本对象的构建块。它没有对其他对象的引用。
- Composite: 它由各个子对象(leaf元素)组成,并在基本组件中实现操作。
比如图表是一种由圆形、三角形等对象组成的结构。当我们为图表填充颜色时,填充的颜色也会作用到图表中的每个对象。图表中的对象都有相同操作,那就是填充颜色。
二.代码示例
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 中大量使用。