目的
组合模式允许用相同的方式处理单个对象或对象的组合体。使用组合模式的场景基本涉及到树形结构。
UML类图
实例分析
我们以在一个画布上绘图为例。需要画圆
、正方形
、圆+正方形
的组合,我们希望能用同一个接口来操作组合图的绘制过程,而不是我们先画一个圆
,再画一个正方形
。这里就可以使用组合模式进行处理。
我们首先创建一个图形结构的基类,提供一个绘图接口:
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; }
|
参考