#include#include #include
using namespace std; class Cmd; using PCmd = shared_ptr ; class Cmd { public: virtual ~Cmd() {} void operator()() { execute(); } //wzorzec komendy virtual PCmd clone() = 0; virtual void add(PCmd c) {} //dodaje komendę do kolekcji private: virtual void execute() = 0; //implementacja akcji dla konkretnej komendy }; class CmdDrawLine : public Cmd { public: virtual PCmd clone() { return PCmd(new CmdDrawLine(*this)); } private: virtual void execute() { cout << "CmdDrawLine" << endl; } //implementacja jest nieistotna w tym zadaniu }; class CmdPrintText : public Cmd { public: virtual PCmd clone() { return PCmd(new CmdPrintText(*this)); } private: virtual void execute() { cout << "CmdPrintText" << endl; } //implementacja jest nieistotna w tym zadaniu }; class CmdMacro { }; int main() { PCmd m1(new CmdMacro); m1->add(PCmd(new CmdDrawLine)); m1->add(PCmd(new CmdPrintText)); m1->add(PCmd(new CmdPrintText)); PCmd m2(new CmdMacro); m2->add(m1); m2->add(m1); (*m2)(); return 0; } } Polecenia:
- Dostarcz kod klasy CmdMacro.Twój kod nie musi się kompilować, ale powinno w nim być widać rozwiązanie.
- Klasa ta pozwala wykonywać komendy w kolejności ich dodania. Jakiego wzorca projektowego użyłeś do dostarczenia tego udogodnienia?
- Co robi metoda 'clone'?
- Nie zapomnij dostarczyć metodę 'clone' dla klasy CmdMacro