шаблон класса для шаблона команды, который поддерживает отмену

Для простых команд, которые не могут быть отменены и не требуют аргументов,
мы можем использовать шаблон класса для параметризации получателя команды.
Мы определим подкласс шаблона SimpleCommand для таких команд.
SimpleCommand параметризован типом Receiver и поддерживает
привязка между объектом-получателем и действием, хранящимся как указатель на
функция-член. введите описание изображения здесь

введите описание изображения здесь Имейте в виду, что это
Решение работает только для простых команд. Более сложные команды, которые
отслеживать не только их получатели, но и аргументы и / или отменить
состояние требует командного подкласса.

От : GoF

Почему командам, которым требуется сохранить состояние отмены, нужен подкласс команд?

Почему мы не можем сделать что-то подобное?

class Memento
{
};class myMemento : public Memento
{
friend myclass;
};

class yourMemento : public Memento
{
friend yourclass;
};

class SupportsMemento
{
public:
Memento * getMemento();
reinstateMemento(Memento *);

};

class myclass : public SupportsMemento
{
myMemento * getMemento();
reinstateMemento(myMemento *); // breaks LSP
}

template<class Receiver>
class StandardCommand : public Command
{
public:
typedef void (Receiver::*Action)();

StandardCommand(Reciever * r, Action a):
_receiver(r), _action(a){}
virtual void execute();
virtual void unexecute();
private:
Receiver * _receiver;
Action _action;
Memento * m;
};

template<class Receiver>
void StandardCommand<Receiver>::execute()
{
m=_reciever->getMemento();
(_reciever->*_action)();
};

template<class Receiver>
void StandardCommand<Receiver>::unexecute()
{
_receiver->reinstante_Memento(m);
};

Это потому что это ломает LSP, или есть какая-то другая причина этого?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …