行为型模型 备忘录模式

Posted 云水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型模型 备忘录模式相关的知识,希望对你有一定的参考价值。

行为型模型 备忘录模式

 

应用场景
如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。
1)一个类需要保存它的对象的状态(相当于Originator角色)
2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

 

 

 

Originator(原生者)
        需要被保存状态以便恢复的那个对象。
Memento(备忘录)
        该对象由Originator创建,主要用来保存Originator的内部状态。
Caretaker(管理者)
        负责在适当的时间保存/恢复Originator对象的状态。

适用于:
        在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。
        适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。

 

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

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>

class MememTo
{
public:
    MememTo(std::string name, int age)
    {
        m_name = name;
        m_age = age;
    }
    void setName(std::string name)
    {
        m_name = name;
    }
    std::string getName()
    {
        return m_name;
    }
    void setAge(int age)
    {
        m_age = age;
    }
    int getAge()
    {
        return m_age;
    }
private:
    std::string m_name;
    int m_age;
};

class Person
{
public:
    Person(std::string name, int age)
    {
        m_name = name;
        m_age = age;
    }
    void setName(std::string name)
    {
        m_name = name;
    }
    std::string getName()
    {
        return m_name;
    }
    void setAge(int age)
    {
        m_age = age;
    }
    int getAge()
    {
        return m_age;
    }
    void printT()
    {
        std::cout << "name: " << m_name << " age: " << m_age << std::endl;
    }

    // 创建备份
    MememTo * createMememTo()
    {
        return new MememTo(m_name, m_age);
    }
    // 恢复备份
    void SetMememTo(MememTo *mememto)
    {
        m_name = mememto->getName();
        m_age = mememto->getAge();
    }

private:
    std::string m_name;
    int m_age;
};

// 管理者
class Caretaker
{
public:
    Caretaker(MememTo * mememto)
    {
        m_mememto = mememto;
    }
    MememTo * getMememTo()
    {
        return m_mememto;
    }
    void setMememTo(MememTo *mememto)
    {
        m_mememto = mememto;
    }
private:
    MememTo * m_mememto;
};


void mytest()
{
    Person * p1 = new Person("张三", 18);
    p1->printT();
    // 创建备份
    MememTo *membak = p1->createMememTo();
    p1->setAge(28);
    p1->printT();
    // 恢复备份
    p1->SetMememTo(membak);
    p1->printT();

    delete p1;
    p1 = nullptr;
    delete membak;
    membak = nullptr;

    // 通过管理者进行备份恢复
    Person * p2 = new Person("李四", 25);
    p2->printT();
    // 创建备份
    Caretaker * ct = new Caretaker(p2->createMememTo());
    p2->setAge(29);
    p2->printT();
    // 恢复备份
    p2->SetMememTo(ct->getMememTo());
    p2->printT();

    delete p2;
    p2 = nullptr;
    delete ct->getMememTo();
    delete ct;
    ct = nullptr;

    return;
}


int main()
{
    mytest();

    system("pause");
    return 0;
}

 

以上是关于行为型模型 备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

Python 设计模式 — 行为型模式 — 备忘录模式

行为型设计模式之备忘录模式

行为型设计模式之备忘录模式

Python 设计模式 — 行为型模式 — 备忘录模式

JAVA SCRIPT设计模式--行为型--设计模式之Memnto备忘录模式(18)

JAVA SCRIPT设计模式--行为型--设计模式之Memnto备忘录模式(18)