08 组合模式(Composite Design Pattern)

一句话概括:在一个类里创建一个其它类集合,并提供add remove等方法来维护它。

组合模式,也叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式被用在当我们不得不表示部分-整体(part-whole)层次结构时,组合模式依据树形结构来组合对象,用来表示部分以及整体层次。它创建了对象组的树形结构。

PS:脑补一下Winows文件系统的图。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

让我们用一个真实的例子来理解它: 一个图是一个由诸如圆,线,三角形等对象组成的结构。当我们用颜色填充图形(比如红色)时,相同的颜色也会被应用到多个对象。 这里的绘图由不同的部分组成,它们都具有相同的操作。

组合结构包含一下对象:

  • Base Component(基础组件) - 基础组件是组合中所有对象的接口,客户端程序使用基础组件来处理组合中的对象。 它可以是一个接口或一个抽象类,包含一些对所有对象都是通用的方法。
  • Leaf(叶子对象) - 定义组合中元素的行为。 它是组合的基本组成部分,并且实现了基础组件。 它没有对其他组件的引用。
  • Composite(组合对象) – 它由叶元素组成并实现基本组件中的操作。

组合模式基本组件定义了叶子对象和组合对象的基本通用方法。

Shape.java

//基本组件
//We can create a class Shape with a method draw(String fillColor) to draw the shape with given color.
public interface Shape {

    public void draw(String fillColor);
}

Composite Design Pattern Leaf Objects

组合模式的叶子对象实现了基本组件,these are the building block for the composite, 我们可以创建多个叶子对象,如三角形,圆形等。

Triangle.java

public class Triangle implements Shape {

    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Triangle with color "+fillColor);
    }
}

Circle.java

public class Circle implements Shape {

    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Circle with color "+fillColor);
    }

}

Composite object

组合对象包含了一组叶子对象,我们应该提供一些helper方法来添加或删除叶子对象。

public class Drawing implements Shape{

    //collection of Shapes
    private List shapes = new ArrayList();

    @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 Design Pattern Client Program

TestCompositePattern.java

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

Composite Pattern Important Points

  • Composite pattern should be applied only when the group of objects should behave as the single object.
  • Composite design pattern can be used to create a tree like structure.

java.awt.Container#add(Component) is a great example of Composite pattern in java and used a lot in Swing.

你可能感兴趣的:(08 组合模式(Composite Design Pattern))