• 行为型模型 备忘录模式


    行为型模型 备忘录模式

    应用场景
    如果一个对象需要保存状态并可通过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;
    }
  • 相关阅读:
    Timer 实现2秒4秒连环炸
    Java中的注解
    PHP连接打印机
    php同步mysql两个数据库中表的数据
    thinkphp 两表、三表联合查询
    ereg/eregi报错处理办法
    ThinkPHP3.2判断手机端访问并设置默认访问模块的方法
    使用PHP获取时间今天 明天 昨天 时间戳的详解
    jquery获取radio和select选中值
    php开启mysqli扩展之后如何连接数据库
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7783192.html
Copyright © 2020-2023  润新知