W aplikacji akcje użytkownika reprezentujemy przez komendy, obiekty typu Cmd. Wykonanie komendy to wołanie metody 'operator()'. Przykładem jest komenda 'CmdDrawLine' i 'CmdPrintText'. Dodaj komendę 'Makro', która reprezentuje sekwencję komend i wykonuje je w kolejności dodawania ich do sekwencji.

#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:

  1. Dostarcz kod klasy CmdMacro.Twój kod nie musi się kompilować, ale powinno w nim być widać rozwiązanie.
  2. Klasa ta pozwala wykonywać komendy w kolejności ich dodania. Jakiego wzorca projektowego użyłeś do dostarczenia tego udogodnienia?
  3. Co robi metoda 'clone'?
  4. Nie zapomnij dostarczyć metodę 'clone' dla klasy CmdMacro