设计模式第6篇:组合设计模式

一.组合设计模式要解决的问题

组合设计模式也是一种结构设计模式,当在一个结构设计中,当所有的对象被当做同一种方式操作时,应该考虑选择组合设计模式。

二.组合设计模式的要点

  1. 基础组件(抽象类或接口),通常是组合设计中所有叶子类的一个接口,客户端程序通过这个基础组件让这些叶子类工作在一起。基础组件通常是一个接口或者抽象类,它拥有所有叶子类都拥有的一些方法。
  2. 叶子类,在组合设计中叶子类通过实现基础组件中的方法来定义元素的行为。
  3. 组合类,组合类包含所有的叶子类元素,并实现基础组件中的方法。

三.组合设计模式代码用例

下面通过画一个图表的例子来说明:画图时我们可以选择画三角形、圆形、直线等,当我们在画板中选中一种颜色时,不管画任何图形都是同一种颜色,不难看出所有图形子类在画颜色时都是同一种方式,我们可以考虑组合设计模式,其中叶子类就是三角形、圆形、直线等。

  1.基础组件类

  基础组件定义子类和组合类共同的方法,下面创建一个基础组件接口Shape,包含draw(String fillColor)方法。

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

  2.叶子类

  这里定义两个叶子类,圆形类和三角形类,如下:

/*圆形类*/
class Circle implements Shape {

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

}
/*三角形类*/
class Triangle implements Shape {

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

}

  3.组合类

  组合类包含所有叶子类对象,并应该提供一些方法来添加或者删除叶子类对象,同样组合类需要实现基础组件Shape接口。

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();
    }
}

  4.组合模式测试

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

四.组合模式使用场景的要点

  1.当一组对象(叶子类)的表现行为像一个对象时可以考虑组合设计模式。

  2.组合设计模式可以被用来创建一个树形结构。

java.awt.Container中的add(Component)方法用的就是组合模式.

原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10233408.html