algorytm.org

Implementacja w C/C++

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Polecenie (command) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 0
SłabyŚwietny
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;
}
Dodaj komentarz