软件设计:实验 20:备忘录模式

news/2024/11/29 9:44:45/文章来源:https://www.cnblogs.com/xuan-2004/p/18575858

实验 20:备忘录模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解备忘录模式的动机,掌握该模式的结构;

2、能够利用备忘录模式解决实际问题。

 

[实验任务一]:多次撤销

改进课堂上的用户信息操作撤销实例,使得系统可以实现多次撤销(可以使用HashMapArrayList等集合数据结构实现)。

实验要求:

1. 画出对应的类图;

2. 提交源代码;

3. 注意编程规范。

1.

 

2.import java.util.ArrayList;

import java.util.List;

 

// 发起人类

class Originator {

    private String state;

 

    public void setState(String state) {

        this.state = state;

    }

 

    public String getState() {

        return state;

    }

 

    // 创建备忘录

    public Memento createMemento() {

        return new Memento(state);

    }

 

    // 恢复备忘录

    public void restoreMemento(Memento memento) {

        this.state = memento.getState();

    }

}

 

// 备忘录类

class Memento {

    private String state;

 

    public Memento(String state) {

        this.state = state;

    }

 

    public String getState() {

        return state;

    }

}

 

// 负责人类

class Caretaker {

    private List<Memento> mementos = new ArrayList<>();

 

    // 添加备忘录

    public void add(Memento memento) {

        mementos.add(memento);

    }

 

    // 获取备忘录

    public Memento get(int index) {

        return mementos.get(index);

    }

 

    // 移除备忘录

    public void remove(int index) {

        mementos.remove(index);

    }

}

 

// 客户端代码

public class MementoPatternDemo {

    public static void main(String[] args) {

        Originator originator = new Originator();

        Caretaker caretaker = new Caretaker();

 

        // 第一次状态改变

        originator.setState("State 1");

        caretaker.add(originator.createMemento());

 

        // 第二次状态改变

        originator.setState("State 2");

        caretaker.add(originator.createMemento());

 

        // 第三次状态改变

        originator.setState("State 3");

        caretaker.add(originator.createMemento());

 

        // 执行撤销操作

        originator.restoreMemento(caretaker.get(1)); // 回到 State 2

        System.out.println("After first undo: " + originator.getState());

 

        originator.restoreMemento(caretaker.get(0)); // 回到 State 1

        System.out.println("After second undo: " + originator.getState());

    }

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843286.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea源码下载问题: Cannot download sources Sources not found for:xxx

转载: 原文地址 问题出现的原因是我新建项目后没有手动设置仓库地址,导致用命令mvn dependency:resolve -Dclassifier=sources下载的源码全部自动的下载到默认仓库:C:\Users\xxx\.m2\repository而idea选择源文件时跳出的文件选择框还是我自定义的仓库 所以找不到源码文件,其…

@Url.Content

@Url.Content 是ASP.NET MVC中的一个HTML帮助器,用于生成相对于应用程序根目录的URL。这个帮助器特别有用当你需要引用静态内容,如图片、CSS文件、JavaScript文件等,这些文件通常放在Content文件夹中。 使用@Url.Content可以确保生成的URL是正确的,无论应用程序的基路径是什…

Linux安装RabbitMQ详细教程(最详细的图文教程)

一、环境准备1、RabbitMQ版本 和 Erlang 版本兼容性关系 https://www.rabbitmq.com/which-erlang.html 2、ErLang安装教程 https://www.cnblogs.com/haoliyou/p/17666817.html 3、RabbitMQ的安装依赖于erlang所以先安装4、RabbitMQ CentOS 参考安装步骤 https://www.rabbitmq.c…

考研打卡(30)

开局(30) 开始时间 2024-11-29 08:23:23 结束时间 2024-11-29 09:21:22今早醒来,打了十几个喷嚏,蹲了一分钟才发现是女厕所(还好没人)数据结构 有一个有序表R[1...13]={1,3,9,12,32,41,45,62,75,77,82,95,100}, 当用二分查找法查找值为82的节点时,经过____…

连续分配管理方式

连续分配管理方式 ‍ ​​ 补充: 非连续分配管理方式:基本分页存储管理 基本分段存储管理 段页式存储管理一、前言 对于内存来说:内部碎片:已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间 外部碎片:还没有被分配出去(不属于任何进程),但由于太小了无…

覆盖与交换

覆盖与交换 ‍ ​​ ‍一、覆盖技术 (一)思想 将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。 (二)实现 将内存分为一个“固定区”和若干个“覆盖区”。 需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束) 不常用的段放…

Qt支持RKMPP硬解的视频监控系统/性能卓越界面精美/实时性好延迟低/录像存储和回放/云台控制

一、前言 之前做的监控系统,已经实现了在windows上硬解码比如dxva2和d3d11va,后续又增加了linux上的硬解vdpau的支持,这几种方式都是跨系统的硬解实现方案,也是就是如果都是windows系统,无论X86还是ARM都通用,在系统层面屏蔽了实现细节,按照规范来写就行,这种方式叫跨硬…

20222313 2024-2025-1 《网络与系统攻防技术》 实验五实验报告

1. 实验内容 1.1 实验要求 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取相关信息。 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所在的具体地理位置。 (3)使用nmap开源软件对靶机环境进行扫描,回答以下问题并…

多协议兼容:开启跨网文件传输的新纪元!

金融、医疗、政府单位、跨国公司等企业内部往往存在多个隔离的网络环境,如内网、外网、测试网等。随着数字化办公的深入,内网与内网、内网与外网间的文件交换需求频繁,传统的文件传输方式已无法满足安全、合规的文件交换需求。1、跨国公司在不同地区运营时,需要安全、高效地…

Odoo和其他SprinBoot框架同时存在时时区问题

因为Centos的停更以及Odoo版本升级后更加友好的支持了Ubuntu所以发布Odoo服务使用了Ubuntun系统环境,因为Odoo为国外人开发所以他们默认代码中处理了跨时区的问题,便于在国内可以友好显示,但是我还不能手动去调时区,要不然就的处理Odoo的源代码了,可是我还有另一个MySQL的…

请问PbootCMS模板调用当前栏目的文章和分页

#### 调用当前栏目的文章 ```html {pboot:list num=10 scode={sort:scode} page=0}<li><a href="[list:link]">[list:title lencn=20]</a></li> {/pboot:list}扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精…

帝国CMS导入恢复数据MySQL server has gone away错误的解决办法

问题原因: max_allowed_packet 配置值过小。 解决方案:Windows/Linux:在 my.ini 或 my.cnf 文件中添加或修改:max_allowed_packet=150M保存后重启MySQL服务。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascri…