读书人

composite模式解决方案

发布时间: 2013-10-21 17:02:52 作者: rapoo

composite模式
最近看设计模式 ,看到composite模式的一段代码,有些不明白,请高手指点


#include <vector>
#include <iostream> // std::cout
#include <memory> // std::auto_ptr
#include <algorithm> // std::for_each
#include <functional> // std::mem_fun
using namespace std;

class Graphic //class component
{
public:
virtual void print() const = 0;
virtual ~Graphic() {}
};

class Ellipse : public Graphic // class Leaf
{
public:
void print() const {
cout << "Ellipse \n";
}
};

class CompositeGraphic : public Graphic // class composite conclude a vector of pointer of componet
{
public:
void print() const {
// for each element in graphicList_, call the print member function
for_each(graphicList_.begin(), graphicList_.end(), mem_fun(&Graphic::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;
}



输出四次Ellipse,为什么不是两次? 设计模式
[解决办法]
引用:
graphic1 中有三个对象,graphic2中一个对象,graphic中两个对象。

而graphic->print(); 我觉得应该是输出graphic中的两个对象,所以是两次。


graphic->print()确实会输出graphic中的两个对象,但这两个对象依然是CompositeGraphic,分别 是graphic1,graphic2,输出graphic1时输出了里面的3个ellipse,输出graphic2时输出了里面的1个ellipse。

读书人网 >C++

热点推荐