Java 中的复合设计模式

组合模式是结构设计模式的一种。当我们必须表示部分-整体层次结构时,使用复合设计模式。

复合设计模式

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

1.基本组件 -基本组件是组合中所有对象的接口,客户端程序使用基本组件来处理组合中的对象。它可以是一个接口,也可以是一个** 抽象class** ,其中包含所有对象通用的一些方法。 2.Leaf -定义组合中元素的行为。它是组成和实现基本组件的构建块。它没有对其他组件的引用。 3.组合 -由叶子元素组成,在基础组件中实现操作。

在这里,我将复合设计模式应用于绘图场景。

复合模式库组件

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

1package com.journaldev.design.composite;
2
3public interface Shape {
4    
5    public void draw(String fillColor);
6}

复合设计模式叶对象

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

 1package com.journaldev.design.composite;
 2
 3public class Triangle implements Shape {
 4
 5    @Override
 6    public void draw(String fillColor) {
 7    	System.out.println("Drawing Triangle with color "+fillColor);
 8    }
 9
10}

Circle.java,你知道的。

 1package com.journaldev.design.composite;
 2
 3public class Circle implements Shape {
 4
 5    @Override
 6    public void draw(String fillColor) {
 7    	System.out.println("Drawing Circle with color "+fillColor);
 8    }
 9
10}

复合对象

复合对象包含一组叶子对象,我们应该提供一些辅助方法来添加或删除该组中的叶子。我们还可以提供一种从组中删除所有元素的方法。Drawing.java

 1package com.journaldev.design.composite;
 2
 3import java.util.ArrayList;
 4import java.util.List;
 5
 6public class Drawing implements Shape{
 7
 8    //collection of Shapes
 9    private List<Shape> shapes = new ArrayList<Shape>();
10    
11    @Override
12    public void draw(String fillColor) {
13    	for(Shape sh : shapes)
14    	{
15    		sh.draw(fillColor);
16    	}
17    }
18    
19    //adding shape to drawing
20    public void add(Shape s){
21    	this.shapes.add(s);
22    }
23    
24    //removing shape from drawing
25    public void remove(Shape s){
26    	shapes.remove(s);
27    }
28    
29    //removing all the shapes
30    public void clear(){
31    	System.out.println("Clearing all the shapes from drawing");
32    	this.shapes.clear();
33    }
34}

请注意,除了可以包含一组叶子元素之外,Composal还实现了组件,其行为类似于叶子。复合模式,复合设计模式Java我们的复合模式实现已经准备好了,我们可以用客户端程序测试它。

复合设计模式客户端程序

TestCompositePattern.Java

 1package com.journaldev.design.test;
 2
 3import com.journaldev.design.composite.Circle;
 4import com.journaldev.design.composite.Drawing;
 5import com.journaldev.design.composite.Shape;
 6import com.journaldev.design.composite.Triangle;
 7
 8public class TestCompositePattern {
 9
10    public static void main(String[] args) {
11    	Shape tri = new Triangle();
12    	Shape tri1 = new Triangle();
13    	Shape cir = new Circle();
14    	
15    	Drawing drawing = new Drawing();
16    	drawing.add(tri1);
17    	drawing.add(tri1);
18    	drawing.add(cir);
19    	
20    	drawing.draw("Red");
21    	
22    	drawing.clear();
23    	
24    	drawing.add(tri);
25    	drawing.add(cir);
26    	drawing.draw("Green");
27    }
28
29}

上述复合模式客户端程序的输出为:

1Drawing Triangle with color Red
2Drawing Triangle with color Red
3Drawing Circle with color Red
4Clearing all the shapes from drawing
5Drawing Triangle with color Green
6Drawing Circle with color Green

复合模式要点

  • 仅当该组对象应作为单个对象时,才应应用复合图案。
  • 复合设计模式可用于创建树状结构。

java.awt.Container# Add(Component)是Java中复合模式的一个很好的例子,在Swing中使用得很多。早期的结构设计模式文章:

  • Java中的桥接模式
  • Java中的适配器设计模式
Published At
Categories with 技术
comments powered by Disqus