设计模式—行为型模式之备忘录模式

设计模式---行为型模式之备忘录模式

备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。这是一种对象行为型模式。

有如下角色:

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

示例

比如我们有一个奥特曼游戏,每一个奥特曼有血量,等级,我们可以建一个游戏备份来保存这些有用的内容,并使用游戏服务器管理他们。

奥特曼类如下:

java 复制代码
@Data
public class Ultraman {
    private Integer hp;//血量
    private Integer level;//等级

    //备忘录管理者
    private GameServer gameServer = new GameServer();

    /**
     * 进行游戏
     */
    public void play(){
        hp = level = new Random().nextInt();
    }

    /**
     * 保存备忘录
     */
    public void saveRocord() throws Exception {
        System.out.println("保存备忘录");
        gameServer.addRecord(this);
    }

    /**
     * 获取备忘录
     */
    public Ultraman restoreRecord(Integer id) throws Exception {
        System.out.println("获取记录");
        return gameServer.getRecord(id);
    }

    public void exit() throws Exception {
        System.out.println("退出并存档");
        gameServer.addRecord(this);
    }
}

记录类如下:

java 复制代码
/**
 * 游戏备份----备忘录
 */
@Data
public class GameRocord {
    private Integer id;//备忘录id
    private Integer hp;//血量
    private Integer level;//等级
}

游戏服务器类如下:

java 复制代码
/**
 * 游戏服务器------备忘录管理者
 */
public class GameServer {
    //记录id
    private Integer i = 1;
    //备忘录管理
    private Map<Integer,GameRocord> recordMap = new HashMap<>();

    /**
     * 添加备忘录
     */
    public void addRecord(Ultraman ultraman) throws Exception {
        GameRocord gameRocord = new GameRocord();
        BeanUtils.copyProperties(gameRocord,ultraman);
        gameRocord.setId(i++);
        recordMap.put(gameRocord.getId(),gameRocord);
    }

    /**
     * 恢复备忘录
     */
    public Ultraman getRecord(Integer id) throws Exception{
        GameRocord gameRocord = recordMap.get(id);
        Ultraman ultraman = new Ultraman();
        BeanUtils.copyProperties(ultraman,gameRocord);
        return ultraman;
    }

}

测试类如下:

java 复制代码
public class MementoTest {
    public static void main(String[] args) throws Exception {
        Ultraman ultraman = new Ultraman();
        //进行游戏
        ultraman.play();
        //存档
        ultraman.saveRocord();
        ultraman.setHp(1);
        ultraman.saveRocord();
        Ultraman ultramanRecord = ultraman.restoreRecord(1);
        ultraman.exit();
    }
}

运行截图如下:

相关推荐
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式
大数据新鸟1 天前
设计模式四大基本原则
设计模式
南一Nanyi2 天前
依赖注入和控制反转
前端·设计模式·nestjs
tiankong12132 天前
如何拓展多态下的子类
设计模式·c#
jctech2 天前
让「小程序」跑起真正的原生代码:ComboNative 多进程原生小程序运行时 · Alpha 首发
android·设计模式·架构
Kel3 天前
Node.js 单线程高并发:从内核中断到 JS 回调的完整技术栈
设计模式·架构·node.js
解局易否结局4 天前
ArkUI MVI 架构实战:单向数据流设计模式在 HarmonyOS NEXT 中的深度实践
华为·设计模式·架构·harmonyos
解局易否结局4 天前
ArkTS 设计模式与架构进阶:构建可维护的 HarmonyOS 应用
华为·设计模式·架构·harmonyos
happyness444 天前
AI编程与设计模式
设计模式·ai编程
就是小王同学啊4 天前
Spring小技巧之设计模式
sql·spring·设计模式