首页 > 其他分享 >软件设计:实验 20:备忘录模式

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

时间:2024-11-29 09:43:56浏览次数:11  
标签:originator 20 String 软件设计 备忘录 state public Memento

实验 20:备忘录模式

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

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

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

 

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

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

实验要求:

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());

    }

}

 

标签:originator,20,String,软件设计,备忘录,state,public,Memento
From: https://www.cnblogs.com/xuan-2004/p/18575858

相关文章

  • 2024.11.28联考总结(补)
    省流:T4炸成狗。复盘T1很水,看了一眼感觉结论题,类似洛谷月赛Div2T1水平,结果一眼没秒,于是二眼,结果二眼没秒,于是三眼\(\dots\)然后听见有人开始噼里啪啦,有点不慌。然后8:20开始写,5min后写挂,然后又想了想会了,又写5min不到,过完大样例是8:40。然后看看T2,有一个很明显的\(......
  • mysql 单表2000w怎么算的
    1.**页大小和存储结构**:-InnoDB存储引擎以页(Page)为单位存储和管理数据,默认页大小为16KB。其中,文件头、页头、页目录等元数据占用了一部分空间,剩下的大约15KB用来存储行记录。2.**索引页和数据页**:-索引页主要存储索引和指针,数据页存储完整的行数据。对于索引页,如果......
  • 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开源软件对靶机环境进行扫描,回答以下问题并给出操作命令。(4)使用......
  • VS2022监视窗口怎么打开
    1.写好代码后,进行调试按F10必须先进行调试,如果不先进行调试直接点击调试+窗口是下面的情况2.点开调试(D)—>窗口(W)—>监视(W)—>四个窗口随便选一个3.之后逐步按F10就可以一步一步的监视每一句代码啦......
  • 2024-2025 20241323 第十周学习总结
    这个作业属于https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01这个作业的目标信息系统数据库与SQL人工智能与专家系统人工神经网络模拟与离散事件排队系统天气与地震模型图形图像作业正文https......
  • 1205. 每月交易 II
    目录题目链接(无_力扣VIP_略过)1.读题(建议使用这种表结构_数据对比看)题目SQLSchema建表语句_数据2.答案_一图解一图解答案------------------------------------------------------------------------------解题分析图览方法1方法2难点分析关键总结题目链接(......
  • noip2024模拟赛记录
    20241028A.铁路2题意简述给一棵树,每次跳一条简单路径,定义\(f(x,y)=\min(\texttt{x到y经过的简单路径长度})\)求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(i,j)\)思路注意到,一定存在到直径端点的方案,找到直径,搜索即可CodecodeconstintN=5e5+10;intn;ve......
  • 20241128 闲话 NOIP
    当我打完乒乓球回到机房坐下的时候,我才确切地意识到明天就要出发去NOIP了。我已经不太能清楚地记得我的第一次NOIP了,只记得考前两个星期停课停到没有意识到星期五要放学;只记得考前非常紧张,非常想证明自己;只记得事与愿违,不到1h过掉T1T2的天胡开局因为T4看错时限(虽然看对......
  • 2024/11月 读书笔记 - 6《构建之法》--- 第六章
    第六章详细介绍了敏捷开发流程,它主要包含三个核心步骤:·ProductBacklog:确定完成产品所需完成的工作。·SprintBacklog:决定当前Sprint(冲刺)需要解决的任务。·Sprint:执行冲刺,完成既定任务。敏捷开发以用户需求的演变为核心,采用迭代和逐步完善的方法进行软件开发。这一流程不仅......
  • LeetCode2058. 找出临界点之间的最小和最大距离
    本题,有一定难度,但不大(我设了个全局变量,被坑了题目:本题要我们求出两个极值点最大距离以及最小距离,如果不存在则返回[-1,-1]不难看出,最小距离只会在相邻两个极值点取得,最大值则是一头一尾,这也启发我们要设置变量,用来记录头尾极值点的位置,以及两个相邻极值点的距离代码如......