23种设计模式C++源码与UML实现--备忘录模式

本文介绍了Memento模式,一种用于保存和恢复对象状态的行为模式。通过实例展示如何在Person类中实现备忘录模式,包括Originator、Memento和Caretaker的角色。适合那些需要维护复杂历史状态的类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备忘录模式

Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象内部状态,并在需要的时候(undo/roback)回复对象以前的状态。

应用场景

如果一个对象需要保存状态,并通过undo或者roback等操作回复到通知以前的状态时,可以使用Memmento模式。

  1. 一个类需要保存它的对象的状态(相当于Originator角色)
  2. 设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
  3. 需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
  4. undoroback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

在这里插入图片描述

Originator-原生者

需要被保存状态以便恢复的那个对象

Memento-备忘录

该对象由Originator创建,主要用来保存Originator的内部状态

Caretaker-管理者

负责在适当的时间保存/恢复Originator对象的状态

适用于:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。适用于功能比较复杂的,需要记录或者维护历史属性的类。

//
// Created by andrew on 2020/11/28.
//
#include <iostream>

using namespace std;

// Caretaker 管理者
// Memento 备忘录

class Memento{
public:
    Memento(string name, int age){
        m_name = name;
        m_age = age;
    }
    string getName(){
        return m_name;
    }
    int getAge() const{
        return m_age;
    }
    void setName(string name){
        this->m_name = name;
    }
    void setAge(int age){
        this->m_age = age;
    }

private:
    string m_name;
    int m_age;
};

class Person{
public:
    Person(string name, int age){
       m_name = name;
       m_age = age;
    }
    string getName(){
        return m_name;
    }
    int getAge() const{
        return m_age;
    }
    void setName(string name){
        this->m_name = name;
    }
    void setAge(int age){
        m_age = age;
    }
    // 保存,将需要的信息记录到Memento中
    Memento *createMemento()
    {
        return new Memento(m_name, m_age);
    }
    //还原
    void setMemento(Memento *memento)
    {
        this->m_name = memento->getName();

        this->m_age = memento->getAge();
    }

    void printT(){
        cout << "m_name:" << m_name << "m_age:" << m_age << endl;
    }

private:
    string m_name;
    int m_age;
};

class Caretaker{
public:
    explicit Caretaker(Memento * memento){
        this->memento = memento;
    }
    Memento *getMemento(){
        return memento;
    }

    void setMemento(Memento *memento){
        this->memento = memento;
    }

private:
    Memento *memento;
};

int main(int argc, char* argv[]){

    Caretaker *caretaker = nullptr;
    auto *p = new Person("bob", 32);
    p->printT();

    cout << "----------------------" << endl;
    caretaker = new Caretaker(p->createMemento());
    p->setAge(42);
    p->printT();

    cout << "ro back" << endl;
    p->setMemento(caretaker->getMemento());
    p->printT();

    cout << "memento pattern" << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achilles.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值