设计模式---状态变化模式之备忘录模式(Memento)

一:概念

用于保存对象的内部状态,并在需要的时候(undo/rollback)回复对象以前的状态

二:应用场景

如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。

1)一个类需要保存它的对象的状态(相当于Originator角色);
2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色);
3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存;
4)undo或rollback操作时,通过Caretacker保存的Memento恢复Originator对象的状态。

三:动机

在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需求,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其它对象得到对象的状态,便会暴露对象的实现细节。
如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。

四:模式定义

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

                                                                    ——《设计模式》GoF

五:代码讲解

(一)需要保存状态的对象

class Originator
{
    string state;
    //....多个内部状态
public:
    Originator() {}
    Memento createMomento() {
        Memento m(state);  //在某个点时对状态(有可能需要编码序列化等操作)进行快照保存
        return m;
    }
    void setMomento(const Memento & m) {
        state = m.getState();  
    }
};

补充:

函数的局部对象在当前函数被调用的时候创建,存储在栈区,在函数结束以后就会被释放,如果存在返回值,那么当前对象也会被释放,只不过在被释放前
做了一次拷贝,拷贝到接受该返回值的另外一个对象上面,所以函数的入参和返回值其实都进行的是拷贝操作,新的对象被赋值,旧的的对象被回收

(二)外部保存对象状态的类

class Memento
{
    string state;  //保存方式多样,序列化,内存流等方式
    //..和上面状态对应,存储其中有效的状态(不一定是一模一样)
public:
    Memento(const string & s) : state(s) {}
    string getState() const { return state; }
    void setState(const string & s) { state = s; }
};

(三)使用

int main()
{
    Originator orginator;  //原发器

    //捕获对象状态,存储到备忘录
    Memento mem = orginator.createMomento();

    //... 改变orginator状态

    //从备忘录中恢复
    orginator.setMomento(memento);

}

六:类图(结构)

七:要点总结

(一)备忘录(Memento)存储原发器(Originator)对象的内部状态,在需要时恢复原发器的状态。

(二)Memento模式的核心是信息隐藏,即Originator需要向外接隐藏信息,保持其封装性。但同时又需要将其状态保持到外界(Memento)

(三)由于现代语言运行时(如C#、java等)都具有相当的对象序列化支持,因此往往采用效率较高、又较容易正确实现的序列化方案来实现Memento模式。

原文地址:https://www.cnblogs.com/ssyfj/p/9545969.html

时间: 2024-10-10 18:24:05

设计模式---状态变化模式之备忘录模式(Memento)的相关文章

设计模式(行为型)之备忘录模式(Memento Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之中介者模式(Mediator Pattern)>http://blog.csdn.net/yanbober/article/details/45533335 概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

【设计模式与Android】备忘录模式——在齐太史简

什么是备忘录模式 所谓备忘录模式,就是在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后可将这个对象恢复到原先保存的状态的设计模式. 备忘录模式的实现方式   备忘录模式的实现方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露. 民族英雄文天祥<正气歌>记载了一个"在齐太史简"的故事,我们先定义一个历史类: public class History { private String

【一起学设计模式】中介者模式+观察者模式+备忘录模式实战:(二)提交个订单我到底经历了什么鬼?

前言 再多的话就不说了,这个是接着上一讲: [一起学设计模式]状态模式+装饰器模式+简单工厂模式实战:(一)提交个订单我到底经历了什么鬼? 一起的,一些多余的赘述请先看这个篇文章. 业务场景 一图流,还是上一篇文章中一样的图,接下来我们就梳理下总结模式.观察者模式.备忘录模式的应用: 订单中心: 1.订单中心创建订单 2.订单状态流转(状态模式) 3.记录操作日志(装饰器模式+简单工厂模式) 4.订单中心通知 库存中心更新库存 调度中心: 1.库存中心更新本地库存(使用命令模式+模板方法模式+工

22行为型模式之备忘录模式

概念 Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态. 应用场景 如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式. 1)一个类需要保存它的对象的状态(相当于Originator角色) 2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色) 3)需要的时候,Caretaker角色要求Originator返回一个Memen

设计模式的征途—20.备忘录(Memento)模式

相信每个人都有后悔的时候,但是人生并无后悔药,有些错误一旦发生就无法再挽回,有些事一旦错过就不会再重来,有些话一旦说出口也就不可能再收回,这就是人生.为了不让自己后悔,我们总是需要三思而后行.这里我们要学习一种可以在软件中实现后悔机制的设计模式—备忘录模式,它是软件中的“后悔药”. 备忘录模式(Memento) 学习难度:★★☆☆☆ 使用频率:★★☆☆☆ 一.可悔棋的中国象棋游戏 Background:M公司欲开发一款可以运行在Android平台的触摸式中国象棋软件,如下图所示.由于考虑到有些用

设计模式之十四:备忘录模式(Memento)

备忘录模式: 在不破换封装性的前提下,捕获一个对象的内部状态并将这个状态保存到对象外部,这样这个对象之后可以恢复到保存的状态. Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later UML图: 主要包括: Memento(Memento):存储Originator的内部状态.

大战设计模式【22】—— 备忘录模式

备忘录模式(Memento) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态 二.结构 Originator(原发器):它是一个普通类,可以创建一个备忘录,并存储其当前内部状态,也可以使用备忘录来恢复其内部状态,一般需要保存内部状态的类设计为原发器. Memento(备忘录):存储原发器的状

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

备忘录模式   Memento (行为型模式) 1.概述 备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 例如:一些软件提供的撤销功能,游戏的存档读档功能. 2.结构图 3.代码 1 /* 2 * 原发器类 Originator 3 */ 4 public class Role { 5 6 private int level ; 7 private int life ; 8 9 public Role() { 10