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; }