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

Posted fourmi_gsj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-(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 = \0;
    _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;
}

以上是关于设计模式-(Memento)在不破坏封装性的前提下,捕捉类内的一个状态信息,并根据这个信息进行恢复。的主要内容,如果未能解决你的问题,请参考以下文章

备忘录模式

备忘录模式(Memento)

Memento模式详解--设计模式(16)

备忘录模式(Memento)

(十三)备忘录模式

B9:备忘录模式 Memento