//: C10:Strategy.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.
// Návrhový vzor Strategie
#include <iostream>
using namespace std;

class StrategieJmeno {
public:
  virtual void pozdravit() = 0;
};

class Pozdravit : public StrategieJmeno {
public:
  void pozdravit() {
    cout << "Ahoj! Jak se máš?" << endl;
  }
};

class Ignorovat : public StrategieJmeno {
public:
  void pozdravit() {
    cout << "(Dělám, že tě nevidím)" << endl;
  }
};

class PriznatSe : public StrategieJmeno {
public:
  void pozdravit() {
    cout << "Promiň. Zapomněl jsem, jak se jmenuješ." << endl;
  }
};

// "Kontext" řídí strategii:
class Kontext {
  StrategieJmeno& strategie;
public:
  Kontext(StrategieJmeno& strat) : strategie(strat) {}
  void pozdravit() { strategie.pozdravit(); }
};

int main() {
  Pozdravit pozdravit;
  Ignorovat ignorovat;
  PriznatSe priznani;
  Kontext c1(pozdravit), c2(ignorovat), c3(priznani);
  c1.pozdravit();
  c2.pozdravit();
  c3.pozdravit();
} ///:~
