行为设计模式:备忘录模式

概念

此模式可在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

将对象状态的副本存储在一个名为备忘录的特殊对象中。除了创建备忘录的对象外,任何对象都不能访问备忘录的内容。

代码示例

代码来自这里

class Memento // 备忘录类
{
public:
    Memento(QString state) :state(state) {}
    const QString getState() const
    {
        return state;
    }
    void setState(QString state)
    {
        this->state = state;
    }

private:
    QString state;
};

//具有状态的对象,状态可变
class Originator
{
public:
    Originator(QString state) :state(state){}
    Memento* createMemento()
    {
        return new Memento(state);
    }
    void setMemento(Memento *memento)
    {
        state = memento->getState();
    }
    void changeState(QString state)
    {
        this->state = state;
    }
    void showState()const
    {
        qDebug() << "state==" << state;
    }

private:
    QString state;
};

class Caretaker // 管理者类
{
public:
    Caretaker(Originator *originator) : originator(originator){}
    ~Caretaker()
    {
        qDeleteAll(mementos);
    }
    void save(Memento *memento) // 记录备忘录某一时刻的状态
    {
        mementos.push_back(memento);
    }
    void undo(int index) // 返回备忘录某个时刻index的状态
    {
        originator->setMemento(mementos.at(index));
    }

private:
    QList<Memento*> mementos; // 不需要在参数列表初始化
    Originator *originator;
};

int main(int argc, char *argv[])
{
    Originator *originator = new Originator(QString { "初始状态" });
    Caretaker *caretaker = new Caretaker(originator);
    caretaker->save(originator->createMemento()); // 保存初始状态
    originator->showState(); // 打印初始状态

    originator->changeState(QString{ "状态1" }); // 状态发生改变1
    caretaker->save(originator->createMemento());
    originator->showState();

    originator->changeState(QString{ "状态2" }); // 状态发生改变2
    caretaker->save(originator->createMemento());
    originator->showState();

    caretaker->undo(0); // 返回到最初状态
    originator->showState();

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值