深入解析Java组合设计模式:原理与实战应用

这是文章《Java中的组合设计模式》的第1部分(共1部分)。

内容片段: 组合模式是结构性设计模式之一。当我们需要表示一个部分-整体层次结构时,会使用组合设计模式。

组合设计模式

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

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

在这里,我正在为绘画场景应用组合设计模式。

复合模式基本组件

组合模式的基本组件为叶节点和复合节点定义了共有的方法。我们可以创建一个类Shape,并拥有一个方法draw(String fillColor),来用给定的颜色绘制形状。Shape.java。

package com.Olivia.design.composite;

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

组合设计模式的叶子对象

组合设计模式的叶子类实现了基本组件,这些是构成复合对象的基本单位。我们可以创建多个叶子对象,比如Triangle(三角形),Circle(圆形)等。Triangle.java。

package com.Olivia.design.composite;

public class Triangle implements Shape {

	@Override
	public void draw(String fillColor) {
		System.out.println("用颜色 "+fillColor+" 绘制三角形");
	}

}

Circle.java

package com.Olivia.design.composite;

public class Circle implements Shape {

	@Override
	public void draw(String fillColor) {
		System.out.println("用颜色 "+fillColor+" 绘制圆形");
	}

}

复合对象

一个复合对象包含了一组叶子对象,并且我们应该提供一些帮助方法来添加或删除组中的叶子。我们也可以提供一个方法来移除组中的所有元素。Drawing.java。

package com.Olivia.design.composite;

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

public class Drawing implements Shape{

	// 形状的集合
	private List<Shape> shapes = new ArrayList<Shape>();
	
	@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("从绘图中清除所有形状");
		this.shapes.clear();
	}
}

请注意,组合模式也实现了组件并且与叶子节点类似,只是它可以包含一组叶子元素。我们的组合模式已经实现完成,现在可以用客户程序进行测试。

复合设计模式客户端程序

测试CompositePattern.java

package com.Olivia.design.test;

import com.Olivia.design.composite.Circle;
import com.Olivia.design.composite.Drawing;
import com.Olivia.design.composite.Shape;
import com.Olivia.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("红色");
		
		drawing.clear();
		
		drawing.add(tri);
		drawing.add(cir);
		drawing.draw("绿色");
	}

}

上述组合模式客户端程序的输出结果是:

用颜色 红色 绘制三角形
用颜色 红色 绘制三角形
用颜色 红色 绘制圆形
从绘图中清除所有形状
用颜色 绿色 绘制三角形
用颜色 绿色 绘制圆形

复合模式要点

  • 只有当一组对象应该作为单个对象运行时,才应该应用组合模式。
  • 组合设计模式可用于创建树状结构。

Java的java.awt.Container#add(Component)是Java中组合模式的一个很好的例子,并且在Swing中被广泛使用。之前的结构设计模式文章如下:

  • Java中的桥接模式
  • Java中的适配器设计模式
bannerAds