墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. 设计模式
  4. 正文

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

2023年 5月 18日 192点热度 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“游侠”降临A股:16个“大脑”组团“炒股”,30秒“算命”市场! 视频魔法来了!AI能实时“变脸”直播,连游戏画面也能瞬间换装? 告别“听指令”,AI要“自己动手”了!ChatGPT Agent,AI界的“全能选手”已上线! 8B 模型吊打 671B?数学证明界“卷王”Goedel-Prover-V2 来了! Kiro来了!亚马逊放大招,软件开发要被AI“绑架”了吗? 火速围观!Trae IDE 迎来两大明星模型,Kimi K2 硬核登场,Grok-4 (Beta) 闪耀国际!
Kimi变身学术“卷王”,你的论文和报告还好吗?昆仑万维扔出王炸:32B模型干翻671B,代码界迎来全能修理工!8亿参数撬动实时混音!谷歌开源“口袋DJ”,人人都能玩转音乐告别插件时代!OmniGen2:一个模型,通吃所有AIGC神操作2000万次呼唤背后,蓝骑士有了“赛博外挂”智能触手可及:Google Gemma-3n 系列模型,让万物皆能“思考”
java 数据库连接池技术Apache Commons DBCP的(超详细总结) Java多线程的原子类 告别“打工人”模式,AI“全能选手”RoboNeo 来了! OpenAI GPT-4o:颠覆创作流程的“全能画手”来了 java Web框架Play的(超详细总结) 无须邀请码的OpenManus来了:手把手教你部署开源版「AI智能体革命」
标签聚合
deepseek spring java 算法 设计模式 教程 大模型 AI

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策