Java中的复合设计模式

时间:2020-02-23 14:36:11  来源:igfitidea点击:

复合模式是结构设计模式之一。
当我们必须表示部分整个层次时,将使用复合设计模式。

复合设计模式

当我们需要以必须以相同方式对待结构中的对象的方式创建结构时,可以应用复合设计模式。

让我们以一个真实的例子来理解它–图表是由诸如圆形,直线,三角形等对象组成的结构。
当我们用颜色(例如红色)填充图形时,相同的颜色也将应用于对象中。
画画。
其中绘图由不同的部分组成,它们都具有相同的操作。

复合模式包含以下对象。

  • 基本组件–基本组件是合成中所有对象的接口,客户端程序使用基本组件来处理合成中的对象。
    它可以是接口或者抽象类,其中包含所有对象共有的某些方法。

  • 叶–定义合成中元素的行为。
    它是构成的基础,并实现了基本组件。
    它没有引用其他组件。

  • 复合–由叶元素组成,并在基本组件中实现操作。

其中我正在为绘图方案应用复合设计模式。

复合模式基础组件

复合模式基础组件定义了叶子和复合材料的通用方法。
我们可以使用方法draw(String fillColor)创建类Shape来绘制具有给定颜色的形状。

Shape.java

package com.theitroad.design.composite;

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

复合设计模式叶对象

组合设计模式叶实现了基础组件,这些是组合的构建块。
我们可以创建多个叶子对象,例如Triangle,Circle等。

Triangle.java

package com.theitroad.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.theitroad.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.theitroad.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.theitroad.design.test;

import com.theitroad.design.composite.Circle;
import com.theitroad.design.composite.Drawing;
import com.theitroad.design.composite.Shape;
import com.theitroad.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中使用了很多。