Java 中的复合设计模式
复合模式是结构设计模式之一。当我们必须表示部分-整体层次结构时,使用复合设计模式。
复合设计模式
当我们需要创建一个结构,以便以相同的方式处理结构中的对象时,我们可以应用复合设计模式。让我们通过一个现实生活中的例子来理解它 - 图表是一种由诸如圆形、线条、三角形等对象组成的结构。当我们用颜色(例如红色)填充图形时,相同的颜色也会应用于图形中的对象。这里的绘图由不同的部分组成,它们都有相同的操作。复合模式由以下对象组成。
- 基础组件- 基础组件是组合中所有对象的接口,客户端程序使用基础组件与组合中的对象协作。它可以是一个接口或一个抽象类,其中包含一些所有对象共有的方法。
- 叶- 定义组合中元素的行为。它是组合的构建块并实现基本组件。它没有对其他组件的引用。
- 复合- 它由叶元素组成并实现基础组件中的操作。
在这里,我将复合设计模式应用于绘图场景。
复合模式基础组件
复合模式基础组件定义了叶子和复合模式的通用方法。我们可以创建一个类,Shape
使用一个方法draw(String fillColor)
来绘制具有给定颜色的形状。Shape.java
package com.journaldev.design.composite;
public interface Shape {
public void draw(String fillColor);
}
复合设计模式叶对象
复合设计模式 leaf 实现了基础组件,这些是复合的构建块。我们可以创建多个 leaf 对象,例如三角形、圆形等。Triangle.java
package com.journaldev.design.composite;
public class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color "+fillColor);
}
}
Circle.java
package com.journaldev.design.composite;
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color "+fillColor);
}
}
复合对象
复合对象包含一组叶子对象,我们应该提供一些辅助方法来从组中添加或删除叶子。我们还可以提供一种方法从组中删除所有元素。Drawing.java
package com.journaldev.design.composite;
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 也实现了 component,并且行为类似于 leaf,只是它可以包含 leaf 元素组。我们的复合模式实现已经准备就绪,我们可以用客户端程序对其进行测试。
复合设计模式客户端程序
TestCompositePattern.java
package com.journaldev.design.test;
import com.journaldev.design.composite.Circle;
import com.journaldev.design.composite.Drawing;
import com.journaldev.design.composite.Shape;
import com.journaldev.design.composite.Triangle;
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
复合模式重点
- 仅当对象组应像单个对象一样运行时才应应用复合模式。
- 复合设计模式可用于创建树状结构。
java.awt.Container#add(Component)
是 Java 中 Composite 模式的一个很好的例子,在 Swing 中被广泛使用。早期的结构设计模式文章: