//: C10:PrikazPattern.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
#include <iostream>
#include <vector>
using namespace std;

class Prikaz {
public:
  virtual void proved() = 0;
};

class Ahoj : public Prikaz {
public:
  void proved() { cout << "Ahoj "; }
};

class Lidi : public Prikaz {
public:
  void proved() { cout << "Lidi! "; }
};

class JaJsem : public Prikaz {
public:
  void proved() { cout << "Já jsem vzor Příkaz!"; }
};

// Objekt uchovávající příkazy:
class Makro {
  vector<Prikaz*> prikazy;
public:
  void pridat(Prikaz* c) { prikazy.push_back(c); }
  void spustit() {
    vector<Prikaz*>::iterator it = prikazy.begin();
    while(it != prikazy.end())
      (*it++)->proved();
  }
};

int main() {
  Makro makro;
  makro.pridat(new Ahoj);
  makro.pridat(new Lidi);
  makro.pridat(new JaJsem);
  makro.spustit();
} ///:~
