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

本文详细介绍了备忘录设计模式的概念、结构与实现方法,并通过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 main()
{
    // 发起人,并设置状态
    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. 总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值