Composite模式
让客户可以统一处理单个对象和对象组合。 复合模式可以代表两种情况。 在这种模式下,可以开发用于表示部分 - 整体层次结构的树结构。在该例子中,Composite 模式可以处理Ellipse和Ellipse的组合,及graphicComposiote.
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>
using namespace std;
class Graphic
{
public:
virtual void print() const = 0;
virtual ~Graphic(){};
};
class Ellipse:public Graphic
{
public:
void print() const
{
cout<<"Ellipse \n"<<endl;
}
};
class CompositeGraphic: public Graphic
{
public:
public:
void print() const {
for(Graphic * a: graphicList_) {
a->print();
}
}
void add(Graphic *aGraphic)
{
graphicList_.push_back(aGraphic);
}
private:
vector<Graphic*> graphicList_;
};
int main()
{
// Initialize four ellipses
const auto_ptr<Ellipse> ellipse1(new Ellipse());
const auto_ptr<Ellipse> ellipse2(new Ellipse());
const auto_ptr<Ellipse> ellipse3(new Ellipse());
const auto_ptr<Ellipse> ellipse4(new Ellipse());
// Initialize three composite graphics
const auto_ptr<CompositeGraphic> graphic(new CompositeGraphic());
const auto_ptr<CompositeGraphic> graphic1(new CompositeGraphic());
const auto_ptr<CompositeGraphic> graphic2(new CompositeGraphic());
// Composes the graphics
graphic1->add(ellipse1.get());
graphic1->add(ellipse2.get());
graphic1->add(ellipse3.get());
graphic2->add(ellipse4.get());
graphic->add(graphic1.get());
graphic->add(graphic2.get());
// Prints the complete graphic (four times the string "Ellipse")
graphic->print();
return 0;
}