墨风如雪博客

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

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

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

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
告别AI塑料感:阿里Qwen3-Omni-Flash要把大模型做成真人 GPT-5.2深夜炸场:为了让你每周少干10小时,OpenAI拼了 告别机械音!VoxCPM 1.5开源,这才是我们要的“最强嘴替” Mistral 掀桌了:Devstral 2 与 Vibe CLI 重塑开源编程体验 今夜,智谱把“手机贾维斯”的源代码,扔到了GitHub上 智谱GLM-4.6V开源:不仅仅是“看懂”,它终于长出了“双手”
国产AI代码逆袭:GLM-4.6凭什么并列全球第一?文心5.0:2.4万亿参数的“全能AI”,它真做到了吗?字节TRAE SOLO:你的AI编程副驾已上线!阿里AI的“船票之战”:千问APP剑指C端,能否重塑格局?Grok 4.1:马斯克AI的里程碑式飞跃,它到底有多强?谷歌Gemini 3:当AI开始“自己动手”,我们离未来更近一步
每日一题|剑指Offer地狱级难题!正则表达式匹配,你能扛住吗? Java垃圾回收算法的概述 Spring Cloud 当下最火的Java微服务框架 惊了!国产代码大模型硬刚 GPT-4o,微软也来“蹭热度”? Mistral 掀桌了:Devstral 2 与 Vibe CLI 重塑开源编程体验 JDK1.8新特性详解
标签聚合
deepseek 大模型 教程 java spring 算法 AI 设计模式

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

Theme Kratos Made By Seaton Jiang