Nadesłany przez Jacek Węgorkiewicz, 17 listopada 2016 11:35
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
CommandPattern.cpp:
//============================================================================
// Name : CommandPattern.cpp
// Author : Jacek Węgorkiewicz
// Description : Implementacja wzorca projektowego Command (Polecenie)
// www.algorytm.org
//============================================================================
#include <iostream>
using namespace std;
class Polecenie {
public:
virtual void wykonaj() = 0;
virtual void cofnij() = 0;
virtual ~Polecenie() {} ;
};
class Zawodnik {
private:
string nazwa;
public:
Zawodnik(string name) : nazwa(name) { }
void zacznijBiegac() {
cout << "Zawodnik " << nazwa << " biega" << endl;
}
void przestanBiegac() {
cout << "Zawodnik " << nazwa << " przestal biegac" << endl;
}
void zacznijPlywac() {
cout << "Zawodnik " << nazwa << " plywa" << endl;
}
void przestanPlywac() {
cout << "Zawodnik " << nazwa << " przestal plywac" << endl;
}
void zacznijCwiczyc() {
cout << "Zawodnik " << nazwa << " cwiczy" << endl;
}
void przestanCwiczyc() {
cout << "Zawodnik " << nazwa << " przestal cwiczyc" << endl;
}
};
class Bieganie: public Polecenie {
private:
Zawodnik& zawodnik;
public:
Bieganie(Zawodnik& z) : zawodnik(z) {}
void wykonaj() {
zawodnik.zacznijBiegac();
}
void cofnij() {
zawodnik.przestanBiegac();
}
};
class Plywanie: public Polecenie {
private:
Zawodnik& zawodnik;
public:
Plywanie(Zawodnik& z) : zawodnik(z) {}
void wykonaj() {
zawodnik.zacznijPlywac();
}
void cofnij() {
zawodnik.przestanPlywac();
}
};
class Cwiczenia: public Polecenie {
private:
Zawodnik& zawodnik;
public:
Cwiczenia(Zawodnik& z) : zawodnik(z) {}
void wykonaj() {
zawodnik.zacznijCwiczyc();
}
void cofnij() {
zawodnik.przestanCwiczyc();
}
};
class Trener {
private:
Polecenie* polecenie;
public:
void setMode(Polecenie* p) {
polecenie = p;
}
void rozkaz() {
polecenie->wykonaj();
}
void cofnij() {
polecenie->cofnij();
}
};
class PelnyTrening: public Polecenie {
private:
Polecenie** polecenie;
short ilosc_polecen;
public:
PelnyTrening(Polecenie* p[], short ip) :
ilosc_polecen(ip)
{
polecenie = new Polecenie*[ilosc_polecen];
for(short i = 0; i < ilosc_polecen; i++)
polecenie[i] = p[i];
}
void wykonaj() {
for(short i = 0; i < ilosc_polecen; i++)
polecenie[i]->wykonaj();
}
void cofnij() {
for(short i = 0; i < ilosc_polecen; i++)
polecenie[i]->cofnij();
}
~PelnyTrening() {
delete[] *polecenie;
}
};
int main() {
Trener trener;
Zawodnik z1("Kowalski");
Zawodnik z2("Nowak");
Bieganie bieganie(z1);
Plywanie plywanie(z2);
cout << "Pojedyncze treningi:" << endl;
trener.setMode(&bieganie);
trener.rozkaz();
trener.setMode(&plywanie);
trener.rozkaz();
trener.cofnij();
cout << "Pelny trening:" << endl;
Zawodnik z3("Brzeczyszczykiewicz");
Cwiczenia cwiczenia(z3);
Polecenie* tab[] = { &bieganie, &plywanie, &cwiczenia };
PelnyTrening* pelnyTrening = new PelnyTrening(tab, 3);
trener.setMode(pelnyTrening);
trener.rozkaz();
trener.cofnij();
return 0;
}

