Java中的复合设计模式

组合模式是结构型设计模式之一。组合设计模式用于表示部分-整体层次结构。

组合设计模式

当我们需要以一种方式创建结构,使得结构中的对象必须以相同的方式处理时,我们可以应用组合设计模式。让我们通过一个现实生活的例子来理解它 – 图表是由诸如圆圈、直线、三角形等对象组成的结构。当我们用颜色(比如红色)填充图表时,相同的颜色也会应用到图表中的对象上。这里的图表由不同的部分组成,它们都具有相同的操作。组合模式由以下对象组成。

  1. 基本组件 – 基本组件是组合中所有对象的接口,客户端程序使用基本组件来处理组合中的对象。它可以是一个接口或一个抽象类,其中包含一些对所有对象都通用的方法。
  2. – 定义了组成元素的行为。它是组合的构建块,实现基本组件。它没有引用其他组件。
  3. 复合 – 它由叶元素组成,并实现基本组件中的操作。

这里我正在应用复合设计模式来描述绘图场景。

复合模式基本组件

复合模式基本组件定义了叶和复合的通用方法。我们可以创建一个类Shape,其中包含一个方法draw(String fillColor),用于以给定的颜色绘制形状。Shape.java

package com.journaldev.design.composite;

public interface Shape {
	
	public void draw(String fillColor);
}

复合设计模式叶对象

复合设计模式叶实现基本组件,它们是复合的构建块。我们可以创建多个叶对象,如Triangle、Circle等。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);
	}

}

复合对象

A composite object contains group of leaf objects and we should provide some helper methods to add or delete leafs from the group. We can also provide a method to remove all the elements from the group. Drawing.java

package com.journaldev.design.composite;

import java.util.ArrayList;
import java.util.List;

public class Drawing implements Shape{

	//形状的集合
	private List shapes = new ArrayList();
	
	@Override
	public void draw(String fillColor) {
		for(Shape sh : shapes)
		{
			sh.draw(fillColor);
		}
	}
	
	//向图形添加形状
	public void add(Shape s){
		this.shapes.add(s);
	}
	
	//从图形中移除形状
	public void remove(Shape s){
		shapes.remove(s);
	}
	
	//移除所有形状
	public void clear(){
		System.out.println("Clearing all the shapes from drawing");
		this.shapes.clear();
	}
}

注意,复合对象还实现了组件并且与叶子类似,只是它可以包含一组叶子元素。我们的复合模式实现已经准备就绪,可以用客户端程序进行测试。

复合设计模式客户端程序

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 中组合模式的一个很好的例子,在 Swing 中被广泛使用。较早的结构设计模式文章:

Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java