提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
1. 复合模式简介
复合设计模式是Java中的一种结构型设计模式,它用于表示部分-整体的层次结构。当需要创建一种结构,其中结构中的对象必须以相同的方式对待时,可以使用复合设计模式。例如,一个图表可以由圆形、直线、三角形等对象组成,当我们用颜色填充图表时,相同的颜色也会应用到图表中的各个对象上。这里的图表由不同的部分组成,并且它们都有相同的操作,这就是复合设计模式的典型应用场景。
复合设计模式允许用户以一致的方式处理单个对象和对象组合。通过定义一个抽象的组件类和一些具体的组件类,可以构建复杂的对象结构。这些对象可以动态地添加或删除,从而实现灵活的组合方式。这种模式特别适用于表示部分与整体的关系,如文件系统、组织结构图、UI组件等。
2. 复合模式角色
Java中的复合设计模式包含三个主要角色:Component(抽象构件)、Leaf(叶子构件)和Composite(复合构件)。
2.1 Component(抽象构件)
这是组合中对象的声明接口,它声明了一个接口用于访问和管理Component的子组件。在适当的情况下,它实现所有类共有的接口的默认行为。抽象构件还声明了一个简单方法用于增加(add)和删除(remove)子对象,并允许客户端访问一个子组件。
2.2 Leaf(叶子构件)
在组合中表示叶子节点对象,叶子节点没有子节点。在组合模式的结构中,叶子节点是组合树的基本对象,它不再包含其他的子节点。
2.3 Composite(复合构件)
在组合中表示有子节点的父节点。复合对象的作用是存储子部件,并且在必要时遍历子部件,允许客户端以统一的方式处理叶子对象和复合对象。
通过这些角色,组合模式提供了一种灵活的方式来处理对象组合的复杂性
和一致性
,使得客户端代码可以以统一的方式处理叶子对象和复合对象,而无需关心其具体的实现细节。
3. 复合模式应用代码示例
看过springboot源码的朋友应该都清楚,经常看到有包含类似Composite
词汇的类名,如下图,spring mvc重点Filter,就是一个复合模式的典型应用。
在spring框架中,类似Filter这样的复合设计模式相当多,这里就不列举了!在这里,我将复合设计模式应用于下面绘图场景,一起来看看吧。
3.1 Component(抽象构件)
复合模式抽象组件定义了叶子和复合模式的通用方法。我们可以创建一个类,Shape使用一个方法draw(String fillColor)
来绘制具有给定颜色的形状:Shape.java
public interface Shape {
public void draw(String fillColor);
}
3.2 Leaf(叶子构件)
复合设计模式 leaf
实现了Component(抽象构件),这些是复合的构建块。我们可以创建多个 leaf 对象,例如三角形、圆形等:
- 三角形
Triangle.java
public class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color "+fillColor);
}
}
- 圆形
Circle.java
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color "+fillColor);
}
}
3.3 Composite(复合构件)
复合构件包含一组叶子对象,我们应该提供一些辅助方法来从组中添加或删除叶子。我们还可以提供一种方法从组中删除所有元素,见如下:Drawing.java
import java.util.ArrayList;
import java.util.List;
public class Drawing implements Shape{
//collection of Shapes
private List<Shape> shapes = new ArrayList<Shape>();
@Override
public void draw(String fillColor) {
for(Shape sh : shapes)
{
sh.draw(fillColor);
}
}
//adding shape to drawing
public void add(Shape s){
this.shapes.add(s);
}
//removing shape from drawing
public void remove(Shape s){
shapes.remove(s);
}
//removing all the shapes
public void clear(){
System.out.println("Clearing all the shapes from drawing");
this.shapes.clear();
}
}
请注意,composite(上面的Drawing.java
类) 也实现了 component,并且行为类似于 leaf,只是它可以包含 leaf 元素组。
我们的复合模式实现已经准备就绪,我们可以用客户端程序对其进行测试。
3.4 复合设计模式客户端测试程序
TestCompositePattern.java
public class TestCompositePattern {
public static void main(String[] args) {
Shape tri = new Triangle();
Shape tri1 = new Triangle();
Shape cir = new Circle();
Drawing drawing = new Drawing();
drawing.add(tri1);
drawing.add(tri1);
drawing.add(cir);
drawing.draw("Red");
drawing.clear();
drawing.add(tri);
drawing.add(cir);
drawing.draw("Green");
}
}
上述复合模式客户端程序的输出为:
Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Clearing all the shapes from drawing
Drawing Triangle with color Green
Drawing Circle with color Green
4. 总结
以上就是有关Java设计模式之“复合模式”的详细介绍,通过本文,我们了解到复合模式它是java结构型设计模式之一,同时也清楚复合模式包含的三个角色,分别是抽象组件,叶子构件和复合构件。
我们通过展示了Spring Mvc中Filter的代码,清楚知道Filter其实也是采用的复合设计模式!