目的

组合模式允许用相同的方式处理单个对象或对象的组合体。使用组合模式的场景基本涉及到树形结构。

UML类图

Alt text

实例分析

我们以在一个画布上绘图为例。需要画正方形圆+正方形的组合,我们希望能用同一个接口来操作组合图的绘制过程,而不是我们先画一个,再画一个正方形。这里就可以使用组合模式进行处理。

我们首先创建一个图形结构的基类,提供一个绘图接口:

class Graphic {
public:
virtual void draw() = 0;
};

接着创建能绘制基础图形的派生类,这里创建一个和一个

#include <iostream>
#include "graphic.h"

class Circle : public Graphic {
public:
void draw() {
std::cout << "draw circle" << std::endl;
}
};

class Dot : public Graphic {
public:
void draw() {
std::cout << "draw dot" << std::endl;
}
};

最后需要创建一个组合图形的类,同样继承于Graphic,内部提供一个Graphic的数组指针,来描述组合图形的各个模块,draw方法用来调用各个组合图形的draw方法。

#include "graphic.h"

class CompositeGraphic : public Graphic {
public:
void draw() {
std::cout << "draw composite graphic background" << std::endl;
for(auto child : _childs){
child->draw();
}
}

void add(std::shared_ptr<Graphic> child) {
_childs.push_back(child);
};

private:
std::vector<std::shared_ptr<Graphic>> _childs;
};

使用如下:

#include "composite_graphic.h"
#include "dot.h"
#include "circle.h"

int main() {
std::shared_ptr<CompositeGraphic> graphics = std::make_shared<CompositeGraphic>();
std::shared_ptr<CompositeGraphic> child_graphics = std::make_shared<CompositeGraphic>();
std::shared_ptr<Dot> dot1 = std::make_shared<Dot>();
std::shared_ptr<Dot> dot2 = std::make_shared<Dot>();
std::shared_ptr<Circle> circle = std::make_shared<Circle>();
child_graphics->add(dot1);
child_graphics->add(circle);
graphics->add(child_graphics);
graphics->add(dot2);
graphics->draw();
return 0;
}

参考