对于不可撤消且不需要参数的简单命令, 我们可以使用类模板来参数化命令的接收器。 我们将为这些命令定义模板子类SimpleCommand。 SimpleCommand由Receiver类型参数化并维护一个 接收器对象与存储为指针的动作之间的绑定 成员函数。
请记住这一点 解决方案仅适用于简单命令。更复杂的命令 不仅要跟踪他们的接收器,还要跟踪参数和/或撤消 state需要一个Command子类。
来自:GoF
为什么需要保存undo state的命令需要命令子类?
为什么我们不能这样做?
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,还是有其他原因?