首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

composite模式解决方案

2013-10-21 
composite模式最近看设计模式 ,看到composite模式的一段代码,有些不明白,请高手指点#include vector#inc

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。

热点排行