zoukankan      html  css  js  c++  java
  • 设计模式-(Memento)在不破坏封装性的前提下,捕捉类内的一个状态信息,并根据这个信息进行恢复。

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码

    //Memento.h

    #pragma once
    #include<string>
    
    class Memento;
    class Originator{
    public:
        typedef std::string State;
        Originator();
        virtual ~Originator();
        Originator(const State& st);
        Memento* createMemento();
        void SetMemento(Memento* men);
        void RestoreMemento(Memento* mt);
        State Getstate();
        void Setstate(const State&sdt);
        void PrintState();
    protected:
    private:
        Memento* _mt;
        State _st;
    };
    
    class Memento
    {
    public:
    protected:
    private:
        friend class Originator;
        typedef std::string state;
        Memento();
        virtual ~Memento();
        Memento(const state &sdt);
        void SetState(const state& sdt);
        state GetState();
        state _st;
    };

    //Memento.cpp

    #include"Memento.h"
    #include<iostream>
    typedef std::string state;
    Originator::Originator()
    {
        _st = '';
        _mt = 0;
    }
    Originator::Originator(const state & sdt)
    {
        _st = sdt;
        _mt = 0;
    }
    Originator::~Originator(){}
    Memento* Originator::createMemento()
    {
        return new Memento(_st);
    }
    
    void Originator::SetMemento(Memento* mem)
    {
    
    }
    state Originator::Getstate()
    {
        return _st;
    }
    
    void Originator::Setstate(const state&sdt)
    {
        _st = sdt;
    }
    
    void Originator::PrintState()
    {
        std::cout << this->_st << "...." << std::endl;
    }
    
    void Originator::RestoreMemento(Memento* mn)
    {
        this->_st = mn->GetState();
    }
    
    Memento::Memento(){}
    Memento::~Memento(){}
    Memento::Memento(const state& sdt)
    {
        _st = sdt;
    }
    
    state Memento::GetState()
    {
        return _st;
    }
    
    void Memento::SetState(const state& sdt)
    {
        _st = sdt;
    }

    //main.cpp

    #include"Memento.h"
    #include<iostream>
    #include<string>
    
    int main(int args, char* argv)
    {
        Originator* o = new Originator();
        o->Setstate("Old");
        o->PrintState();
        Memento* m = o->createMemento();
        o->Setstate("New");
        o->PrintState();
        o->RestoreMemento(m);
        o->PrintState();
        getchar();
        return 0;
    }
  • 相关阅读:
    多个相同结构的表的字段的修改、添加
    SQL SERVER 查询去重 PARTITION BY
    message from server: "Host 'xxx' is not allowed to connect to th
    jdk 1.8 连接数据库
    恢复SQLServer数据库后,如何同步登陆名和用户名
    无法识别的属性“targetFramework”。请注意属性名称区分大小写。错误解决办法
    jquery.tablesorter 使用
    MD5加密
    C# 判断是否是节假日
    word ladder
  • 原文地址:https://www.cnblogs.com/fourmi/p/12083677.html
Copyright © 2011-2022 走看看