15、备忘录

2023-10-29

文章目录


package com.example.demo.designpattern;

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;
 * 角色:
 * Originator(原发器):它是一个普通类,可以创建一个备忘录,并存储它的当前内部状态,
 *      也可以使用备忘录来恢复其内部状态,一般将需要保存内部状态的类设计为原发器。
 * Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。
 * 	    备忘录的设计一般可以参考原发器的设计,根据实际需要确定备忘录类中的属性。
 * 	    需要注意的是,除了原发器本身与负责人类之外,备忘录对象不能直接供其他类使用,
 * 	    原发器的设计在不同的编程语言中实现机制会有所不同。
 * Caretaker(负责人/备忘录管理员):它负责保存备忘录,但是不能对备忘录的内容进行操作或检查。
 * 	    在负责人类中可以存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象,也无须知道对象的实现细节
 * 应用:快照存盘;撤销操作;事务管理
 */
public class Memento {
    private String label;
    private String pageName;

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getPageName() {
        return pageName;
    }

    public void setPageName(String pageName) {
        this.pageName = pageName;
    }
}

class OriginatorPage {
    private String label;
    private String pageName;
    private String title;

    public void setLabel(String label) {
        this.label = label;
    }

    public void setPageName(String pageName) {
        this.pageName = pageName;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "OriginatorPage{" +
                "label='" + label + '\'' +
                ", pageName='" + pageName + '\'' +
                '}';
    }
    public Memento createMemento(){
        Memento memento = new Memento();
        memento.setLabel(this.label);
        memento.setPageName(this.pageName);
        return memento;
    }

    public void restoreMemento(Memento memento){
        this.setLabel(memento.getLabel());
        this.setPageName(memento.getPageName());
    }

}

class MementoCaretaker {
    public volatile AtomicInteger index = new AtomicInteger(-1);
    private ArrayList<Memento> mementoList = new ArrayList<>();

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

    public void addMemento(Memento memento) {
        index.incrementAndGet();
        mementoList.add(memento);
    }
}

class BrowserClient {
    public static void main(String[] args) {

        OriginatorPage page = new OriginatorPage();
        page.setPageName("123");
        page.setLabel("www.123.com");
        page.setTitle("123");
        href(page);
        page.setPageName("456");
        page.setLabel("www.456.com");
        page.setTitle("456");
        href(page);
        back(page);
        forward(page);
    }

    private static MementoCaretaker mementoCaretaker = new MementoCaretaker();
    public static void href(OriginatorPage page) {
        mementoCaretaker.addMemento(page.createMemento());
        System.out.println(page);
    }

    public static void back(OriginatorPage page) {
        int i = mementoCaretaker.index.decrementAndGet();
        if (i < 0) {
            System.out.println("no-history");
            return;
        }
        page.restoreMemento(mementoCaretaker.getMemento(i));
        System.out.println("back-to:" + page);
    }

    public static void forward(OriginatorPage page) {
        Memento memento = mementoCaretaker.getMemento(mementoCaretaker.index.incrementAndGet());
        if (memento == null) {
            System.out.println("nothing-to-forward");
            return;
        }
        page.restoreMemento(memento);
        System.out.println("forward-to:" + page);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15、备忘录 的相关文章

  • JavaScript中使用画布实现笑脸火柴人

    在这之前 根本不知道JavaScript具体到底有多重要 现在才明白JavaScript也很强大 从网上看了几个js写的网页小游戏 我都惊呆了 以后一定要好好学习js
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 数据可视化 第4章

    第4章 添加表格QTableView 1 添加table model py 里面子类化QAbstractTableModel 实现自定义table model from PySide2 QtCore import Qt QAbstractT
  • An Introduction to UE4 Plugins

    An Introduction to UE4 Plugins Rate this Article 3 67 3 votes Approved for Versions 4 2 4 3 4 4 4 5 Contents hide
  • <OpenCV> Mat属性

    OpenCV的图像数据类型可参考之前的博客 https blog csdn net thisiszdy article details 120238017 OpenCV Mat类型的部分属性如下 size 矩阵的大小 s i z e
  • VMware虚拟机网络设置(三种网络模式)

    VMware虚拟机网络设置 三种网络模式 VMware网络使用windows虚拟机客户端时一般默认NAT模式自动可以上网 近日安装macos时上网却不行 网上搜索后自己整理出来 对三种模式自己的看法 首先 找到编辑 gt 虚拟网络编辑器 虚
  • k数和

    思路 这道题感觉是一个非常好的动态规划的题目 动态规划方程 d i j target d i 1 j target d i 1 j 1 target a i d i j t a
  • pigz搭配tar开启不了多线程,还是很慢

    Q pigz搭配tar开启不了多线程 还是很慢 A 注意你的压缩的文件夹或文件的名字不要包含 字符 其他字符未尝试
  • Java代码中对文件的操作

    引言 这几天的项目涉及到了文件的操作 我这边做一下整理 环境说明 jdk版本 1 8 0 311 对文件的操作 1 保存文件 保存文件 param file 文件 param path 文件保存目录 param name 保存后的文件名字
  • 怎么在浏览器的控制台上换行输入?

    使用快捷键 shift enter 如

随机推荐

  • python numpy.meshgrid()函数的用法

    numpy meshgrid xi kwargs 从一个坐标向量中返回坐标矩阵 参数 x1 x2 xn array like 表示网格坐标的一维数组 indexing xy ij 可选 笛卡尔 xy 默认值 或矩阵 ij 输出索引 spar
  • matlab跟踪目标图像边缘并计算长轴短轴

    题目如下 对图像进行处理和分析 跟踪出目标边缘 并计算出目标的长轴和短轴及方向 原始图像如图1所示 图1 原始图像 一 处理过程 1 边缘提取 目标边缘提取在图像处理学科中属于数学形态学 在提取目标边缘之前有认真思考过应该用什么方法 是用4
  • java的内存机制以及变量的作用域

    初学者对于Java的类和对象往往一头雾水 尤其是当涉及到程序细节的时候 出现混乱似乎在所难免 笔者根据自己的学习经验 认为 理解java的内存机制以及变量的种类和作用域 对于精确把握编程规则相当重要 一 java内存机制 java程序在内存
  • Springboot整合Mysql集群

    文章目录 一 方法一 1 1 默认配置 1 2 需要自定义配置 1 3 自定义数据库配置类 1 4对从库进行操作 在写一个配置类 一 方法一 1 1 默认配置 1 2 需要自定义配置 1 3 自定义数据库配置类 第一步 添加连接池驱动 第二
  • Java内存的Used、Committed、Max的区别

    不想看英文 可直接看最后的结论 A MemoryUsage object represents a snapshot of memory usage Instances of the MemoryUsage class are usuall
  • 【C语言进阶】文件操作(二)

    大家好我是沐曦希 文件操作 1 前言 2 文件的随机读写 2 1 fseek函数 2 2 ftell函数 2 3 rewind 3 文本文件和二进制文件 4 文件读取结束的判定 4 1 被错误使用的feof 5 文件缓冲区 6 写在最后 1
  • rsync远程同步实现快速、安全、高效的异地备份

    目录 一 rsync介绍 1 rsync是什么 2 rsync同步方式 3 rsync的特性 4 rsync的应用场景 5 rsync与cp scp对比 6 rsync同步源 二 rsync命令 1 常用选项 2 实例 本地复制对比 3 配
  • React(二):React开发神器Webpack

    React 一 React的设计哲学 简单之美 React 二 React开发神器Webpack React 三 理解JSX和组件 React 四 虚拟DOM Diff算法解析 React 五 使用Flux搭建React应用程序架构 上一篇
  • 基于LinearLayout的小标签(TextView)自动换行(修改)

    设计最初是因为公司项目需要多处显示多个小标签 并且需要多行展示 最开始使用的GridLayout 但是这个网格布局局限性太高 标签是动态的 内容也不定 用GridLayout就会有多行占用的各种显示问题 所以后来换成了LinearLayou
  • 【源码学习】正则表达式

    模式 Patterns 和修饰符 flags 正则表达式是提供了一种在文本中进行搜索和替换的强大的方式的模式 在 JavaScript 中 我们可以通过 RegExp 对象使用它们 也可以与字符串方法结合使用 正则表达式 正则表达式 可叫作
  • 如何制作一个微信小程序【微信小程序是怎么做的】

    为什么现在这么多人使用微信小程序呢 因为微信小程序除了便捷易开发 公司企业可以用来做小程序展示官网 商家也可以做小程序商城 甚至个人也可以拥有自己的小程序 那么如何制作一个微信小程序 微信小程序是怎么做的呢 下面给大家说说简单的流程 一 要
  • IGBT的绘制与逆变器的绘制-Visio制图总结【电控类】(三)

    在逆变器非线性补偿研究方向的文章中看到了一些逆变器的示意图 发现均有手绘的痕迹 碰巧在AxGlyph软件中有IGBT这个元件 就截图仿着画了一张IGBT的图 下文中会给出一张IGBT图片和两张逆变器图片 绘图步骤 把截到的IGBT图片粘贴到
  • 一篇搞定Linux和IOS或Android通讯(usbmuxd、libimobiledevice、libusb、AOA)

    1 Linux要与苹果手机通讯需要两个组件 1 usbmuxd 是苹果的一个服务 这个服务主要用于在USB协议上实现多路TCP连接 将USB通信抽象为TCP通信 苹果的iTunes Xcode 都直接或间接地用到了这个服务 参考链接 htt
  • 阻止回车提交表单

  • UNCTF2022 wp Misc magic_word

    知识点 GBK编码 UTF 8编码 零宽度隐写 原题链接 WP 通过文档开篇打油诗中的锟斤拷可以很明显知道此题和UTF 8编码与GBK编码有关 将内容通过UTF 8编码可以得到提示 零宽隐写 将全文清除格式可以得到正文 再使用解码工具解码后
  • SpringBoot_4

    1 PropertySource PropertySource 加载指定的配置文件 properties 先前我们通过 ConfifigurationProperties加载全局配置文件中的值到javabean中 但是我们在具体使用的时候不
  • VScode配置MySQL连接使用MySQL

    目录 本地安装MySQL 1 MySQL官网下载 点击下载 https dev mysql com downloads mysql 2 解压并设置环境变量 3 初始化启动 VScode 连接MySQL 1 安装插件 2 连接MySQL 3
  • Shader Graph简介

    使用着色器 shader 和材质 material 我们能够创造出非常多有趣的效果 除了Unity自带的shader外 还可以自己编写shader或使用其他人所编写的shader 编写shader通常需要我们了解shader编程语言的语法和
  • 代码随想录算法训练营第五十五天

    392 判断子序列 文档讲解 代码随想录 programmercarl com 视频讲解 动态规划 用相似思路解决复杂问题 LeetCode 392 判断子序列 哔哩哔哩 bilibili 状态 没做出来 思路 这道题应该算是编辑距离的入门
  • 15、备忘录

    文章目录 package com example demo designpattern import java util ArrayList import java util concurrent atomic AtomicInteger