[设计模式]行为模式-备忘录(C++描述)

 [设计模式]行为模式-备忘录(C++描述)

second60 20180515

1. 备忘录定义

官方定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。也可以将对象恢复到原先保存的状态。

也称快照模式。

 

2. 备忘录结构图

 

分析:

1. Originator: 发起人记录当前时刻的内部状态,负责创建和恢复备忘录数据。

2. Menento: 备忘录,负责存储发起人对象内部状态

3. Caretaker: 管理角色,对备忘录进行管理,保存和提供备忘录

 

3. 代码

#include <iostream>

using namespace std;

// 备忘录定义

// 用来记录当时的状态

class Memento

{
public:
Memento(const string& state)
{
    _state = state;
}

string getState()
{
    return _state;
}

void setState(const string& state)
{
    _state = state;
}

private:
    string _state;
};
 

// 发起者,即要备忘录的对象
// 发起者可以创建备忘录和恢复备忘录
class Originator
{
public:
Originator(){ _state = ""; }
virtual ~Originator(){}
void setState(const string& state)
{
    _state = state;
}

string getState(){ return _state; }
Memento *createMemento(){
    return new Memento(_state);
}

void restoreMemento(Memento *memento)
{
    _state = memento->getState();
}

private:
    string _state;
};

// 备忘录管理者
// 这里只是管理一个备忘录
// 可以定义一个容器来,来管理一批备忘状态
class Caretaker
{
public:
Memento* getMemento()
{
    return _memento;
}

void setMemento(Memento* memento)
{
_memento = memento;
}

private:
    Memento *_memento;
};

int _tmain(int argc, _TCHAR* argv[])
{
// 发起人,并设置状态
Originator *originator = new Originator();
originator->setState("state_one");
std::cout << originator->getState().c_str() << endl;

// 发起人备忘自已当前状态
Memento* memento = originator->createMemento();

// 备忘录管理者
Caretaker *caretaker = new Caretaker();

// 把备忘备由管理者管理
caretaker->setMemento(memento);

// 发起者修改了自已状态
originator->setState("state_two");
cout << originator->getState().c_str() << endl;

// 发起者想反悔了,想恢复到某一状态
// 备忘录可以有很多不同状态的备忘录
// 备忘后都可以恢复到之前备忘状态
originator->restoreMemento(caretaker->getMemento());
cout << originator->getState().c_str() << endl;

getchar();
return 0;
}


4. 备忘录优缺点

4.1优点:

1. 当发起人角色状态改变时,可能状态错误,能把错误的状态还原回来

2. 备份的状态无须发起人管理,交由管理者管理,逻辑解耦

 

4.2缺点:

1. 实际运用中,备忘录都是多状态的,多备份的,发起人角色状态需要存储到备忘录对象中,需消耗大量资源。

 

5. 备忘录用途

1. 需保存快照

2. 支持回滚的功能

3. 把快照信息和本身分开,不改变原有封装。

4. 游戏进度存盘

5. 需要保存恢复数据的相关状态场景

 

6. 总结

备忘录,在某些保存恢复数据的场景,非常有用,但要一定的内存开销。能在不改变封闭的条件下,新增备忘逻辑。用途没那么广泛,但模式简单,熟悉并运用到可运用场景。

猜你喜欢

转载自blog.csdn.net/second60/article/details/80322684