设计模式之备忘录模式

备忘录模式的概念

备忘录模式是一种行为设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象之前的状态。

主要组成部分

1)Originator(原发器)

负责创建一个包含其内部状态的备忘录对象。

可以使用备忘录来恢复其先前的状态。

2)Memento(备忘录)

存储原发器的内部状态,并防止外部对象访问这些状态。

可能会有两种类型的备忘录:一种是简单的,只存储状态;另一种是复杂的,可能包含多个状态快照。

3)Caretaker(管理者)

负责保存和获取备忘录对象,但不应该操作备忘录的内容。

举个栗子

平常我们玩单机游戏的时候,通过一关游戏都有备份存档的功能,当游戏角色死亡时,可以选择之前备份的存档继续开始游戏

如下图:

流程如下

开始游戏===>通关第一关===>备份第一关存档===>通关第二关===>备份游戏第二关存档===>挑战第三关失败,游戏角色死亡===>选择存档==>恢复备份存档2==>继续挑战第三关

使用java代码实现

创建用户状态源发器

java 复制代码
package org.xiji.menmentopattern;

/**
 * 用户状态源发器
 */
public class UserInfoOriginator  {

    private String userState;

    /**
     *
     * 获取用户状态
     */
    public String getUserState() {
        return userState;
    }

    /**
     * 设置用户状态
     */

    public void setUserState(String userState) {
        this.userState = userState;
    }

    /**
     * 保存用户当前状态===>保存为备忘录对象
     */
    public UserInfoMemento saveStateToMemento(){
        return new UserInfoMemento(this.userState);

    }
    /**
     * 通过备忘录对象恢复用户的某一时刻
     */
    public void recoveryUserInfoState(UserInfoMemento userInfoMemento){
        this.userState = userInfoMemento.getState();

    }



}

创建用户备份管理类

java 复制代码
package org.xiji.menmentopattern;

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

/**
 * 用户备份类管理类
 */
public class UserInfoCaretaker {

    /**
     * 备份集合
     */
    private List<UserInfoMemento> mementoList=new ArrayList<>();

    /**
     * 添加备份对象
     */
    public void add(UserInfoMemento memento) {
        mementoList.add(memento);
    }

    /**
     * 获取备份对象
     */
    public UserInfoMemento get(int index) {
        return mementoList.get(index);
    }
}

创建用户备状态备份类

java 复制代码
package org.xiji.menmentopattern;

/**
 * 用户状态备忘录类
 */
public class UserInfoMemento {
    /**
     * 状态
     */
    private String state;

    public UserInfoMemento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    /**
     * 设置状态
     *  这里用来保存用户状态
     */
    public void setState(String state) {
        this.state = state;
    }

}

创建BackUpMain启动类

java 复制代码
package org.xiji.menmentopattern;

/**
 * 备忘录模式
 */
public class BackupMain {
    public static void main(String[] args) {
        //创建游戏角色
        UserInfoOriginator gameUser = new UserInfoOriginator();
        //角色存档管理器
        UserInfoCaretaker gameUserSaveManger = new UserInfoCaretaker();

        //通过第一关
        System.out.println("通过第一关");
        gameUser.setUserState("第一关通关");

        //备份
        UserInfoMemento firstMemento = gameUser.saveStateToMemento();
        System.out.println("备份成功");

        //存放在备忘录管理者中
        gameUserSaveManger.add(firstMemento);

        //通过第二关
        System.out.println("通过第二关");
        gameUser.setUserState("第二关通关");

        //备份
        UserInfoMemento twoMemento = gameUser.saveStateToMemento();
        System.out.println("备份成功");
        //存放在备忘录管理者中
        gameUserSaveManger.add(twoMemento);
        //用户没有通关,角色死亡
        System.out.println("游戏没有通关,角色死亡");
        gameUser.setUserState("游戏结束");
        System.out.println(gameUser.getUserState());

        System.out.println("选择存档,并且恢复存档");
        //选择存档,并且恢复存档
        gameUser.recoveryUserInfoState(gameUserSaveManger.get(0));
        System.out.println("游戏恢复到第一关");
        System.out.println(gameUser.getUserState());
        //恢复第二关
        System.out.println("选择存档,并且恢复存档");
        gameUser.recoveryUserInfoState(gameUserSaveManger.get(1));
        System.out.println("游戏恢复到第二关");
        System.out.println(gameUser.getUserState());

    }
}

运行结果如下

相关推荐
better_liang43 分钟前
每日Java面试场景题知识点之-消息队列MQ核心场景与实战
java·面试·kafka·消息队列·rabbitmq·rocketmq·mq
小江的记录本1 小时前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码1 小时前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
better_liang2 小时前
每日Java面试场景题知识点之-SpringBoot启动流程
java·面试·springboot·源码解析·启动流程
RyFit2 小时前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
ZhengEnCi3 小时前
01-如何监听接口调用情况?
java·spring boot·后端
JAVA面经实录9174 小时前
MyBatis学习体系
java·mybatis
java1234_小锋4 小时前
在 Spring AI 中如何实现函数调用(Function Calling)?请说明其基本原理和应用场景。
java·人工智能·spring
小马爱打代码5 小时前
Spring源码 第九篇:Spring 5 源码深度拆解 - Spring 事件驱动模型
java·后端·spring
ForgeAI码匠5 小时前
ForgeAdmin|Spring Boot 3 后台框架的自动配置设计:少写配置,多做组合
java·spring boot·后端