支持撤消的命令模式的类模板

时间:2016-01-11 08:36:51

标签: c++ templates design-patterns command-pattern liskov-substitution-principle

  

对于不可撤消且不需要参数的简单命令,   我们可以使用类模板来参数化命令的接收器。   我们将为这些命令定义模板子类SimpleCommand。   SimpleCommand由Receiver类型参数化并维护一个   接收器对象与存储为指针的动作之间的绑定   成员函数。 enter image description here

     

enter image description here请记住这一点   解决方案仅适用于简单命令。更复杂的命令   不仅要跟踪他们的接收器,还要跟踪参数和/或撤消   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,还是有其他原因?

0 个答案:

没有答案