行为型模型 备忘录模式

行为型模型 备忘录模式

应用场景
如果一个对象需要保存状态并可通过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;
}
时间: 2024-08-25 07:18:46

行为型模型 备忘录模式的相关文章

设计模式(行为型)之备忘录模式(Memento Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之中介者模式(Mediator Pattern)>http://blog.csdn.net/yanbober/article/details/45533335 概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无

行为型模型 迭代器模式

行为型模型 迭代器模式 GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示. 为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口. Iterator(迭代器接口):         该接口必须定义实现迭代功能的最小定义方法集         比如提供hasNext()和next()方法. ConcreteIterator(迭代器实现类):         迭代器接口Iterator的实现类.可以根据具体情况加以实现. Aggregate(容器接口)

行为型模型 模版模式

行为型模型 模版模式 应用场景 Template Method模式一般应用在具有以下条件 的应用中:        - 具有统一的操作步骤或操作过程         - 具有不同的操作细节         - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同总结:        在抽象类中统一操作步骤,并规定好接口:让子类实现接口.这样可以把各个具体的子类和操作步骤接耦合 AbstractClass:        抽象类的父类 ConcreteClass:         具

行为型模型 策略模式

行为型模型 策略模式 Strategy:        策略(算法)抽象. ConcreteStrategy         各种策略(算法)的具体实现. Context         策略的外部封装类,或者说策略的容器类.根据不同策略执行不同的行为.策略由外部环境决定. 好处:         //算法的实现 和 客户端的使用 解耦合         //使得算法变化,不会影响客户端 适用于:         准备一组算法,并将每一个算法封装起来,使得它们可以互换. /** * 行为型模型

行为型模型 状态模式

行为型模型 状态模式 Context:用户对象        拥有一个State类型的成员,以标识对象的当前状态: State:接口或基类         封装与Context的特定状态相关的行为: ConcreteState:接口实现类或子类         实现了一个与Context某个状态相关的行为. 适用于:         对象的行为,依赖于它所处的当前状态.行为随状态改变而改变的场景. /** * 行为型模型 状态模式 * State模式也叫状态模式,是行为设计模式的一种. * St

行为型模型 命令模式

行为型模型 命令模式 Command         Command命令的抽象类. ConcreteCommand         Command的具体实现类. Receiver         需要被调用的目标对象. Invorker         通过Invorker执行Command对象. 适用于:         是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. /** * 行为型模型 命令模式 * Command模

&quot;围观&quot;设计模式(26)--行为型之备忘录模式(Memento Pattern)

所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 个人理解 备忘录模式是用于将对象的状态暂存在某些特殊情况下可以将其进行恢复的模式,可以通过多种方式实现,包括clone以及一般方式以及多种参数的备忘录等形式.标准的备忘录在项目中很难直接应用进去,多数为其变形后的处理方式. 备忘录模式角色 备忘录模式主要包含入下几个角色: Originator: 原发器.负责创建一个备忘录,用以记录当前对象的内部状态,通过也可以

行为型_备忘录模式(Memento)

作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式. 解释: 其参与者包括 1.Memnto(备忘录,如下列CountMemento ) 2.Originator(原发器,如下列Counter ), 3.Caretaker(管理者,如下列CounterCaretaker ) Memnto用于保存Originator内部状态,其私有窄接口只能有Originator访问,Caretaker只能访问Memnto的宽接口.所以通常Memnto和Origina

(21):(行为型模式) Memento 备忘录模式

(21):(行为型模式) Memento 备忘录模式,布布扣,bubuko.com