【设计模式】备忘录模式(以电影明日边缘为例)

1、说明

备忘录(Memento): 在不破坏封装性的前提下,捕获一个对象的内部装填,并在对象之外保存这个状态。 这样以后就可以将该对象恢复到原先保存的状态。

三个要素:【发起者】 【备忘录】 【管理者】

2、demo   

电影明日边缘,阿汤哥被将军阁下扔到战场上,阿汤哥慢慢从基地
醒来,迷迷糊糊到看见军队到处在走,头昏混沉沉到,后来阿汤哥
还是被扔到里战场上, 可是阿汤哥每次挂掉以后都能从基地醒来
那阵开始,因此种就相当于游戏里到备忘录,自动读档。

【发起者】 阿汤哥
【备忘录】 阿汤哥读档是到状态
【管理者】 导演

3、上代码

#include <iostream>
using std::cout;
using std::endl;

/*******************************************************
设计模式

备忘录模式

三个要素:【发起者】 【备忘录】 【管理者】

小例:
电影明日边缘,阿汤哥被将军阁下扔到战场上,阿汤哥慢慢从基地
醒来,迷迷糊糊到看见军队到处在走,头昏混沉沉到,后来阿汤哥
还是被扔到里战场上, 可是阿汤哥每次挂掉以后都能从基地醒来
那阵开始,因此种就相当于游戏里到备忘录,自动读档。

【发起者】 阿汤哥
【备忘录】 阿汤哥读档时到状态
【管理者】 导演

*********************************************************/

static char* pState = "慢慢醒来";
static char* pBehaivor = "扶着头慢慢坐起来";

//备忘录
class CMemento
{
public:
    CMemento(char* pState, char* pBehaivor) : m_pState(pState), m_pBehaivor(pBehaivor){}
    virtual ~CMemento(){}
    char* GetState() const {return m_pState;}
    char* GetBehaivor() const {return m_pBehaivor;}

protected:
    char* m_pState;
    char* m_pBehaivor;
};

//阿汤哥
class CTom
{
public:
    CTom(char* pState = 0, char* pBehaivor = 0, CMemento*  pMemento = 0)
     : m_pState(pState), m_pBehaivor(pBehaivor), m_pMemento(pMemento){}
    virtual ~CTom(){}
    CMemento* CreateMemento() { return new CMemento(m_pState, m_pBehaivor); }
    void SetMemento(CMemento* pMemento) {m_pState = pMemento->GetState(); m_pBehaivor = pMemento->GetBehaivor();}
    void Show() const { cout << "\nState is " << m_pState << ", Behaivor is " << m_pBehaivor << " \n";}
    void SetEnv(char* pState, char* pBehaivor) { m_pState = pState; m_pBehaivor = pBehaivor; }

protected:
    char* m_pState;
    char* m_pBehaivor;
    CMemento* m_pMemento;
};

//管理者
class CCaretaker
{
public:
    CCaretaker() : m_pMemento(0){}
    virtual ~CCaretaker(){}
    CMemento* GetMemento() const { return m_pMemento;}
    void SetMemento(CMemento* pMemento) { m_pMemento = pMemento; }

protected:
     CMemento* m_pMemento;
};

int main()
{
    //state:慢慢醒来  behaivor:扶着头慢慢坐起来
    CTom tom(pState, pBehaivor);
    tom.Show();

    cout <<  endl;

    //管理者,保存当前状态
    CCaretaker* pCaretaker = new CCaretaker();
    pCaretaker->SetMemento(tom.CreateMemento());    

    //改变阿汤哥当前状态
    tom.SetEnv("啊 阿汤哥中枪里", "阿汤哥昏迷倒下了");
    tom.Show();

    cout << "---------------说明:阿汤哥要读档了!-------------" << endl;

    //恢复阿汤哥之前状态
    tom.SetMemento(pCaretaker->GetMemento());
    tom.Show();

    cout << endl;

    return 0;
}

4、编译

g++  main.cpp -o main.out

5、执行

./main.out

【设计模式】备忘录模式(以电影明日边缘为例),布布扣,bubuko.com

时间: 2024-10-16 04:26:25

【设计模式】备忘录模式(以电影明日边缘为例)的相关文章

【C#设计模式-备忘录模式】

一.备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.备忘录模式的结构和角色: 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.Originator可以根据需要决定Memento存储自己的哪些内部状态. 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问

设计模式 外观模式 一键电影模式

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25837275 这个模式比较简单,嘿嘿,简单写一下. 老样子,先看 外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用.其实就是为了方便客户的使用,把一群操作,封装成一个方法. 举个例子:我比较喜欢看电影,于是买了投影仪.电脑.音响.设计了房间的灯光.买了爆米花机,然后我想看电影的时候,我需要

我的设计模式:备忘录模式

我的设计模式-备忘录模式 恢复到最初的状态-->对原始状态的保留和恢复 联想到的业务:cms稿件放入到回收站,永久记录状态得用到数据库啊,怎么办?备忘录模式的内存缓存不适用? 类的单一职责 boy职责:状态   改变状态  设置状态  获取状态 备忘录职责:记录当前的状态   恢复状态 迪 米特原则:最少知道原则,不和陌生人说话 问题:备忘录只是记录了一个节点,多个备忘录记录了多个节点,可以恢复到任意节点?备忘录因该支持多个节点? 思考问题:增加备忘录管理者manager角色,有啥好处呢?没体验

[转] Android中的设计模式-备忘录模式

转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 角色 笔记本:很多的内部状态需要被建立一个备忘录来管理,创建和取出

设计模式 状态模式 以自动售货机为例

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模式给了我眼前一亮的感觉啊,值得学习~ 先看定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的. 下面使用个例子来说明状态模式的用法,现在有个自动售货机的代码需要我们来写,状态图如下: 分析一个这个状态图: a.包含4个状态(

设计模式--备忘录模式(Memento)

什么是备忘录模式? 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态. 我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回.这时我们便可以使用备忘录模式来实现. 代码示例: 代码演示了一个单状态单备份的例子,逻辑非常简单:Originator类中的sta

[工作中的设计模式]备忘录模式memento

一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态.备忘录模式常常与命令模式和迭代子模式一同使用. 备忘录模式可以根据客户指令,将相应的对象特有属性进行快照,如果客户要恢复对象,则根据快照提供的特有属性进行还原. 二.模式代码 package memento.patten; /** *备忘录类,同时指定要保存的对象属性

PHP设计模式——备忘录模式

声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. UML类图: 角色: 1.发起人(GameRole):负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.发起人能够依据须要决定备忘录存储自己的哪些内部状态. 2.备忘录(RoleStateSaveBox):负责存储发起人对象的内部状态,并能够防止发起人以

设计模式-备忘录模式实现悔棋操作

利用设计模式中的备忘录模式实现多步悔棋的操作 1 import java.util.*; 2 class Chessman { 3 private String label; 4 private int x; 5 private int y; 6 public static int index=-1; 7 public Chessman(String label,int x,int y) { 8 this.label = label; 9 this.x = x; 10 this.y = y; 1