博客
关于我
19 备忘录模式
阅读量:638 次
发布时间:2019-03-14

本文共 2178 字,大约阅读时间需要 7 分钟。

备忘录模式 (Memento Pattern)

定义

备忘录模式(Memento Pattern)是一种设计模式,旨在在不破坏封装的前提下,捕获一个对象的内部状态,并将这个状态存储在一个特定的对象(备忘录)中。这种方式使得在之后可以恢复该对象至存储的状态,以实现撤销或恢复功能。

结构

备忘录模式的实现通常包含三种主要角色:

  • Originator(原发器)

    原发器是一个普通的类,它通过创建一个备忘录来存储当前的内部状态。原发器可以通过_createMemento()方法创建备忘录,并通过_restoreMemento()方法将存储的状态恢复到它的内部状态。原发器通常用于需要保存内部状态的对象。

  • Memento(备忘录)

    备忘录用于存储原发器的内部状态。它通常会包含原发器的某些方法的副本,确保在注入备忘录时不直接暴露原发器的内部细节。备忘录的设计可以参考原发器的设计,具体实现方式取决于编程语言和实际需求。

  • Caretaker(负责人)

    负责人负责保存备忘录,但不能直接操作或检查备忘录的内容。负责人通常会维护一个容器(如列表、堆栈等),用来存储多个备忘录对象。这使得原发器能够在多次调用 restoring 的时候恢复到不同的历史状态。

  • 代码示例

    Originator类

    public class Originator {    private String state;    public Originator(String state) {        this.state = state;    }    public Memento createMemento() {        return new Memento(this);    }    public void restoreMemento(Memento memento) {        state = memento.getState();    }    public void setState(String state) {        this.state = state;    }    public String getState() {        return state;    }}

    Memento类

    // 备忘录类,默认可见性,包内可见class Mementoclass Memento {    private String state;    public Memento(Originator originator) {        state = originator.getState();    }    public void setState(String state) {        this.state = state;    }    public String getState() {        return state;    }}

    Caretaker类

    public class Caretaker {    private Memento memento;    public Memento getMemento() {        return memento;    }    public void setMemento(Memento memento) {        this.memento = memento;    }}

    测试类

    public class Test {    public static void main(String[] args) {        Originator originator = new Originator("state1");        System.out.println(originator.getState());        Caretaker caretaker = new Caretaker();        caretaker.setMemento(originator.createMemento());        originator.setState("state2");        System.out.println(originator.getState());        originator.restoreMemento(caretaker.getMemento());        System.out.println(originator.getState());    }}

    优缺点与适用环境

    优点

    • 提供了一种状态恢复的实现机制,便于回到特定历史步骤。
    • 备忘录实现了对信息的封装,确保备忘录对象的安全性。
    • 支持多次撤销操作,通过存储备忘录列表实现。

    缺点

    • 资源消耗较大,尤其是在保存大量内部状态时。
    • 备忘录的实现带来一定的代码复杂性。

    适用环境

    • 需要保存对象内部状态的场景。
    • 需要实现撤销或恢复功能的环境。
    • 需要保护对象历史状态不被外界破坏的情况。

    这种模式特别适用于需要多次保存和恢复状态的场景,如文本编辑器的撤销/重做功能,或数据库事务的保存点管理等。

    转载地址:http://thflz.baihongyu.com/

    你可能感兴趣的文章
    OpenCV(1)读写图像
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>
    Openresty框架入门详解
    查看>>
    OpenResty(2):OpenResty开发环境搭建
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    Openstack 之 网络设置静态IP地址
    查看>>
    OpenStack 综合服务详解
    查看>>