墨风如雪博客

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

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

2023年 5月 18日 264点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
DeepSeek OCR:用'眼睛'阅读长文本,AI记忆新纪元? 告别代码苦海:Manus 1.5 让你的创意以光速落地 Anthropic Haiku 4.5:这波AI性能,我愿称之为“超值”! 美团LongCat-Audio-Codec:给语音大模型装上“顺风耳”与“巧舌” 告别无声AI视频!谷歌Veo 3.1打造沉浸式视听盛宴 Karpathy的nanochat:百元就能造ChatGPT?AI圈炸锅了!
国产大模型安全新突破:DeepSeek-R1-Safe,平衡木上的舞者10秒100MB,ChatExcel一键PPT:它真把报告变“魔法”了?深思熟虑的“终章”:DeepSeek-V3.1-Terminus,不止于“完善”英伟达Audio2Face开源:AI给虚拟角色注入灵魂告别纸上谈兵:Meta CWM让AI代码真正活起来告别指令,迎接AI同事!Kimi“OK Computer”模式震撼登场
每日一道算法题:编辑距离算法详解 Spring 三级缓存能解决什么问题和原理(超详细) 2025,AI世界模型新篇章:腾讯混元Voyager展望 Suna 来了!这个能对话、能干活的开源 AI 智能体,也许是 Manus 的劲敌! 开拍!谷歌 Veo 2 正式登陆 Gemini API - 你的视频工作流,准备好被颠覆了吗? 月之暗面Kimi K2-0905:代码与创意的新篇章?
标签聚合
AI deepseek 大模型 java 设计模式 教程 算法 spring

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

Theme Kratos Made By Seaton Jiang