第二十一章 备忘录模式

news2024/12/27 18:56:18

文章目录

  • 前言
  • 一、备忘录模式基本介绍
  • 二、备忘录模式原理代码实现
    • 备忘录对象 Memento
    • 发起者 Originator
    • 管理备忘录类 Caretaker
    • Clint 测试类
  • 三、游戏角色恢复状态实例
    • 备忘录对象
    • 游戏角色
    • 管理备忘录对象
    • 测试 Clint
  • 四、备忘录模式的注意事项和细节


前言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


一、备忘录模式基本介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、备忘录模式原理代码实现

备忘录对象 Memento

package tanchishell.SJMS.memento.theory;

//备忘录对象
public class Memento {

    private String state;

    //构造器
    public Memento(String state) {
        super();
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

发起者 Originator

package tanchishell.SJMS.memento.theory;

//发起者
public class Originator {

    private String state;//状态信息

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    //编写一个方法,可以保存一个状态对象 Memento
//因此编写一个方法,返回 Memento
    public Memento saveStateMemento() {
        return new Memento(state);
    }

    //通过备忘录对象,恢复状态
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

管理备忘录类 Caretaker

package tanchishell.SJMS.memento.theory;

import java.util.ArrayList;
import java.util.List;


//管理备忘录类
public class Caretaker {

    //在 List 集合中会有很多的备忘录对象
    private List<Memento> mementoList = new ArrayList<Memento>();

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

    //获取到第 index 个 Originator 的 备忘录对象(即保存状态)
    public Memento get(int index) {
        return mementoList.get(index);
    }
}

Clint 测试类

package tanchishell.SJMS.memento.theory;

public class Client {

    public static void main(String[] args) {

        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        originator.setState(" 状态#1 攻击力 100 ");
        //保存了当前的状态
        caretaker.add(originator.saveStateMemento());
        originator.setState(" 状态#2 攻击力 80 ");
        caretaker.add(originator.saveStateMemento());
        originator.setState(" 状态#3 攻击力 50 ");
        caretaker.add(originator.saveStateMemento());
        System.out.println("当前的状态是 =" + originator.getState());
        //希望得到状态 1, 将 originator 恢复到状态 1
        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("恢复到状态 1 , 当前的状态是");
        System.out.println("当前的状态是 =" + originator.getState());
    }
}

输出

当前的状态是 = 状态#3 攻击力 50 
恢复到状态 1 , 当前的状态是
当前的状态是 = 状态#1 攻击力 100 

三、游戏角色恢复状态实例

在这里插入图片描述
在这里插入图片描述

备忘录对象

package tanchishell.SJMS.memento.game;

//备忘录对象
public class Memento {

    //攻击力
    private int vit;
    //防御力
    private int def;

    public Memento(int vit, int def) {
        super();
        this.vit = vit;
        this.def = def;
    }

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}

游戏角色

package tanchishell.SJMS.memento.game;

//游戏角色,发起者
public class GameRole {

    private int vit;
    private int def;

    //创建 Memento ,即根据当前的状态得到 Memento
    public Memento createMemento() {
        return new Memento(vit, def);
    }

    //从备忘录对象,恢复 GameRole 的状态
    public void recoverGameRoleFromMemento(Memento memento) {
        this.vit = memento.getVit();
        this.def = memento.getDef();
    }

    //显示当前游戏角色的状态
    public void display() {
        System.out.println("游戏角色当前的攻击力:" + this.vit + " 防御力: " + this.def);
    }

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}

管理备忘录对象

package tanchishell.SJMS.memento.game;


//守护者对象, 保存游戏角色的状态
public class Caretaker {

    //如果只保存一次状态
    private Memento memento;

    //对 GameRole 保存多次状态
    //private ArrayList<Memento> mementos;
    //对多个游戏角色保存多个状态
    //private HashMap<String, ArrayList<Memento>> rolesMementos;
    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

测试 Clint

package tanchishell.SJMS.memento.game;

public class Client {

    public static void main(String[] args) {
        //创建游戏角色
        GameRole gameRole = new GameRole();
        gameRole.setVit(100);
        gameRole.setDef(100);
        System.out.println("和 boss 大战前的状态");
        gameRole.display();
        //把当前状态保存 caretaker
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(gameRole.createMemento());
        System.out.println("和 boss 大战~~~");
        gameRole.setDef(30);
        gameRole.setVit(30);
        gameRole.display();
        System.out.println("大战后,使用备忘录对象恢复到站前");
        gameRole.recoverGameRoleFromMemento(caretaker.getMemento());
        System.out.println("恢复后的状态");
        gameRole.display();
    }
}


输出

和 boss 大战前的状态
游戏角色当前的攻击力:100 防御力: 100
和 boss 大战~~~
游戏角色当前的攻击力:30 防御力: 30
大战后,使用备忘录对象恢复到站前
恢复后的状态
游戏角色当前的攻击力:100 防御力: 100

四、备忘录模式的注意事项和细节

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

顺序表(二)

文章目录 前言一.什么是链表二.线性表的链表结构2.1链表的初始2.2 链表的分类2.3 单链表2.4 双链表 三.java里面的LinkedList API3.1 基础操作3.2 链表的遍历操作 四.模拟实现LinkedList的相关操作创建一个链表头插法尾插法任意位置插入,第一个数据节点为0号下标查找是否包含关…

【网络安全】记一次杀猪盘渗透实战

看起来非常假的网站&#xff0c;这个网站是没有 cdn 的用的是 thinkphpk 框架搭建的。 先打一波 poc 没有效果 访问一下后台直接在 url 后面加/admin。 一个开源的 cms 还没有验证码尝试用 burp 进行爆破&#xff0c;首先在火狐上设置代理 ip 为 127.0.0.1 代理端口为 8081。 B…

性能测试----负载测试、压力测试、并发测试

性能测试&#xff1a;检测一个软件的性能。 性能测试的指标&#xff1a; 响应时间&#xff1a;用户从请求到服务器响应的时间 吞吐量&#xff1a;单位时间内成功地传送数据的数量 并发数&#xff1a;在线并且在操作的用户数 负载测试&#xff1a;加负载&#xff0c;找到让系…

内网:定位域管理员

在域渗透中&#xff0c;获取域内的一个支点后&#xff0c;需要获取管理员权限。在一个域中&#xff0c;当计算机加入域后&#xff0c;会默认给域管理员组赋予本地系统管理员权限。当计算机被添加到域中&#xff0c;成为域的成员主机时&#xff0c;系统会自动将域管理员组添加到…

( “ 图 “ 之 拓扑排序 ) 207. 课程表 ——【Leetcode每日一题】

❓207. 课程表 难度&#xff1a;中等 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课…

C#_委托简述

一.委托的分类 1.delegate关键字 直接通过delegate关键字定义委托类&#xff0c;定义示例如下&#xff1a; delegate void Calculate(int x, int y, int z); 此时可将返回值类型为void、参数类型为(int, int, int)的函数委托给Calculate&#xff0c;示例&#xff1a; Calcu…

今日立夏 — 初夏已至,万物并秀。

晴日暖风生麦气&#xff0c; 绿阴幽草胜花时。 ——《初夏即事》王安石 告别春日和煦的风&#xff0c;立夏缓缓走到眼前。 古人云&#xff1a;“四月立夏为节者&#xff0c;夏&#xff0c;大也&#xff0c;至此之时物已长大&#xff0c;故以为名。”万物生长&#xff0c;人有…

Java—JDK8新特性—Lambda表达式

目录 JDK8新特性 2.Lambda表达式 2.1 什么是Lambda表达式 2.2 为什么使用Lamdba表达式 2.3 Lambda表达式基本语法 JDK8新特性 官网提供网址&#xff1a;JDK 8 Features 2.Lambda表达式 2.1 什么是Lambda表达式 Lamdba是一个匿名函数&#xff0c;可以把Lamdba表达式理解为是…

社群人脉系统源码软件开发

社群人脉系统源码软件技术主要包括以下方面&#xff1a; 后端开发&#xff1a;使用Java、Python等编程语言&#xff0c;采用Spring、Django等框架&#xff0c;实现后台管理系统和API接口开发。 前端开发&#xff1a;使用Vue、React等前端框架&#xff0c;实现用户界面开…

ebpf-linux 安全“双刃剑”

EBPF 技术简介 eBPF全称 extended BPF&#xff0c;Linux Kernel 3.15 中引入的全新设计, 是对既有BPF架构进行了全面扩展&#xff0c;一方面&#xff0c;支持了更多领域的应用,另一方面&#xff0c;在接口的设计以及易用性上&#xff0c;也有了较大的改进。 eBPF 是一个基于寄…

PySpark基础入门(6):Spark Shuffle

PySpark基础入门&#xff08;6&#xff09;&#xff1a;Spark Shuffle - 掘金 (juejin.cn) 目录 shuffle的执行 ShuffleManager Hash Shuffle Sort Shuffle Manage Spark在DAG调度阶段会将一个Job划分为多个Stage&#xff0c;上游Stage做map工作&#xff0c;下游Stage做r…

RN系统精讲-----基础了解

原生基础 安装SDK与Tools preference > appearance > systemSetting > Android sdk 如何连接设备&#xff0c;以及开发中的常用的adb命令 USB连接设备 adb devices 查看连接设备 wifi网络连接设备 adb connect ip&#xff08;手机自己的ip地址&#xff0c;可以通过…

画图以及代码分析结合的循环队列的实现

循环队列的实现 概念以及结构实现初始化判空判满入队出队从队头获得元素从队尾获得元素释放 概念以及结构 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”…

优化| 割平面算法(2): Cover Cuts, Strengthening, Separation及其拓展(理论与实战详解)

【MIP Cutting plane method】-1: Cover cuts MIP的标准形式什么是Cover CutsCover Cuts的详细案例Stronger Cover Cuts及其案例Separation for Cover Cuts用Separation生成 Cover Cuts的详细例子调用Gurobi验证Cover Cuts和Stronger Cover Cuts的作用线性松弛模型的解加入Cove…

领域分类/识别方案

将用户输入与预定义的领域进行匹配 针对领域分类任务&#xff0c;如上图所示&#xff0c;我们首先会从不同的业务中收集大量的业务数据&#xff0c;作为基础的训练数据&#xff0c;虽然这些数据来自不同的业务&#xff0c;但是依然存在一些问题&#xff0c;主要有以下两方面&am…

YOLOv7测距+碰撞检测

YOLOv7测距碰撞检测 1. 相关配置2. 测距原理3. 标定和测距4. 碰撞检测4.1 相关代码4.2 主代码 5. 实验效果 相关链接 1. YOLOV5 单目测距&#xff08;python&#xff09; 2. YOLOV7 单目测距&#xff08;python&#xff09; 3. 具体实现效果已在Bilibili发布&#xff0c;点击…

vscode+gdbserver实现图形化调试Linux应用

一、环境&#xff1a; 1.远程Linux主机Ubuntu22.04&#xff1b; 2.vscode 1.76 二、环境搭建 1.Ubuntu 安装gdb、gdbserver、openssh-server 2.vscode 安装Remote Development、C/C 3.远程连接Linux 点击左下角的绿色按钮&#xff0c;然后选择connect to host----->…

Day1 组队竞赛、删除公共字符

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C/C相关题解 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 选择题1.C基础语法 编程题组队竞赛删除公共字符 选择题 1.C基础语法 题目&#xff1a;以下程序的运行结果是&am…

RSA加密为什么能保证安全

问题&#xff1a;我们都知道RSA加密是安全的&#xff0c;但是我们在使用的使用&#xff0c;怎么使用才能保证数据的安全传输呢&#xff1f; 一、原则&#xff1a;公钥机密、私钥解密、私钥签名、公钥验签 公钥私钥都可以加密和解密数据&#xff0c;但是因为持有公钥和私钥的人…

【Elsevier】中科院2区TOP, 高被引119篇, 稳定检索22年, 1周可见刊,5月15截稿~

一、【期刊简介】 中科院2区软计算类SCI (TOP) 【期刊概况】IF:8.0-9.0, JCR1区, 中科院2区&#xff1b; 【终审周期】走期刊部系统&#xff0c;3-5个月左右录用&#xff1b; 【检索情况】SCI&EI双检&#xff1b;正刊&#xff1b; 【数据库收录年份】2001年&#xff1…