编程语言
首页 > 编程语言> > 23种设计模式C++源码与UML实现--备忘录模式

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

作者:互联网

备忘录模式

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;
}

标签:name,23,int,age,源码,memento,设计模式,Memento,string
来源: https://blog.csdn.net/andrewgithub/article/details/110355938