墨风如雪博客

  • 源码小店
  • 传家宝VPS
让AI使用变得如此简单
  1. 首页
  2. java
  3. 设计模式
  4. 正文

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

2023年 5月 18日 239点热度 0人点赞 0条评论

模式描述

备忘录设计模式(Memento Design Pattern)是一种行为型设计模式,它的主要目的是在不破坏对象封装性的前提下,捕捉和保存一个对象的内部状态,以便稍后可以将对象恢复到该状态。这种模式通常用于实现撤销和重做操作。

主要角色

  1. 备忘录(Memorandum):保存了发起人的状态,从而能够在适当的时候恢复状态。
  2. 发起人(Originator):创建一个备忘录,以表示其当前状态,并可以从备忘录中恢复状态。

引用场景

  1. 后退/前进:浏览器的后退/前进就是缓存页面状态的典型例子。
  2. 撤销/重做:通常基于备忘录模式实现撤销和重做操作。
  3. 快照:保存某个时间点对象的状态快照。

设计要点

  1. 仅仅存储状态:备忘录仅存储对象的内部状态,而不是存储对象的引用。
  2. 完全封装:外部不会访问到备忘录类。
  3. 避免权限问题:发起人应该具有创建和访问备忘录的权限。

优缺点

  • 轻松实现对象状态的快照和恢复
  • 分离了对象与状态的保存与恢复过程
  • 需要额外的空间来存储状态

与备忘录模式类似的模式

  • 原型模式:对一个对象进行克隆,产生一个与原对象类似的新对象。

Java代码示例

首先,我们创建一个发起人(Originator)类,它具有保存和恢复状态的能力:

public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

接下来,我们创建备忘录(Memento)类,用于保存发起人的状态:

public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

现在,我们创建一个负责人(Caretaker)类,用于管理备忘录:

import java.util.ArrayList;
import java.util.List;

public class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void add(Memento state) {
        mementoList.add(state);
    }

    public Memento get(int index) {
        return mementoList.get(index);
    }
}

最后,我们在主类中使用这些类:

public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("State #1");
        originator.setState("State #2");
        caretaker.add(originator.saveStateToMemento());

        originator.setState("State #3");
        caretaker.add(originator.saveStateToMemento());

        originator.setState("State #4");
        System.out.println("Current State: " + originator.getState());

        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("First saved State: " + originator.getState());
        originator.getStateFromMemento(caretaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
    }
}

扩展知识点

备忘录模式与命令模式(Command Pattern)可以结合使用,以实现更加强大的撤销/重做功能。命令模式可以用来记录操作的顺序和执行操作,而备忘录模式用来记录操作前后的状态。这样一来,我们可以轻松地在操作序列中向前或向后移动,同时还可以保留每个操作的上下文信息。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java spring 备忘录设计模式 教程 设计模式
最后更新:2023年 5月 15日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
腾讯混元MT-7B:打破参数迷思,重塑机器翻译版图 瑞士AI宣言:Apertus如何定义开放大模型 月之暗面Kimi K2-0905:代码与创意的新篇章? 谷歌“蕉”傲登场!AI生图告别“走钟”时代 2025,AI世界模型新篇章:腾讯混元Voyager展望 单GPU秒产一分钟!MAI-Voice-1,微软语音AI的“核爆”时刻?
别再卷万亿参数了,这个4B模型正把AI工作站塞进你的手机全球最佳开放模型!OpenAI开源GPT-OSS,AI界迎来巨变!声音即影像:昆仑万维SkyReels-A3如何叩响内容创作的革命前夜9B参数硬撼72B,GLM-4.1V凭什么搅动AI江湖?2B参数掀翻巨头牌桌:昆仑万维UniPic 2.0的“四两拨千斤”天工V2发布:AI终于撕掉了“纯文本”的标签
II-Agent来了!开源智能体新力量崛起,真能挑战闭源巨头? 一台新到手的VPS服务器必做的配置 Spring 中循环依赖问题的产生原因及注意事项 每日一道算法题:二叉树的最小深度 Qwen2.5-max vs DeepSeek R1 模型深度对比:应用场景全解析 NGINX配置文件详解
标签聚合
AI deepseek java 教程 算法 设计模式 spring 大模型

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang