聊聊设计模式——备忘录模式

目录

备忘录模式:行为型设计模式

优点

缺点

结构说明

工作流程

代码练习

应用场景

本质

涉及设计原则

相关设计模式

应用示例


备忘录模式:行为型设计模式

        在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

优点

  1. 封装性:备忘录模式将状态信息封装在备忘录对象中,避免了对象的状态被直接访问和修改。

  2. 灵活性:可以根据需要保存不同时间点的状态,实现多级撤销和恢复功能。

  3. 维护历史记录:备忘录模式允许维护对象状态的历史记录,以便随时恢复到先前的状态。

缺点

  1. 内存开销:如果需要保存大量的备忘录对象,可能会导致内存开销较大。

  2. 性能开销:创建和管理备忘录对象可能会带来一定的性能开销。

结构说明

  1. 备忘录(Memento):负责存储原始对象的状态信息。

  2. 发起人(Originator):负责创建备忘录对象,并在需要时将自身状态恢复到备忘录所记录的状态。

  3. 管理者(Caretaker):负责存储和管理备忘录对象,通常用于维护备忘录的历史记录。

工作流程

  1. 发起人对象创建备忘录对象,并将自身的状态信息保存到备忘录中。

  2. 管理者对象将备忘录对象存储起来,可以选择性地保存多个备忘录对象,形成状态历史。

  3. 当需要恢复对象状态时,管理者对象从历史中选择一个备忘录对象,并将其传递给发起人对象。

  4. 发起人对象使用备忘录中存储的状态信息来恢复自身状态。

代码练习

        备忘录模式可以借助游戏存档来理解。小时候,在玩到一个精彩的副本时,该吃饭了,这个时候只能先存档等吃完饭接着玩了。吃完饭再玩的时候,又觉得刚才的存档因为忙着吃饭有失误,就读取了上一个的存档记录。又可以SSS评分过副本了,美滋滋...

1.创建备忘录对象:游戏存档ProcessFile。

// 备忘录对象 - 游戏存档
public class ProcessFile {
    private String level;
​
    public ProcessFile(String level) {
        this.level = level;
    }
​
    public String getLevel() {
        return level;
    }
}

2.创建发起人对象:游戏进程GameProcess。

public class GameProcess {
    private String level;
    
    public String getLevel() {
        return level;
    }
    
    public void setLevel(String level) {
        this.level = level;
    }
    
    // 创建存档
    public ProcessFile  createProcessFile() {
        System.out.println("创建存档:关卡"+this.level);
        return new ProcessFile(level);
    }
    
    // 读取存档
    public void restoreProcessFile(ProcessFile processFile) {
        this.level = processFile.getLevel();
    }
}

3.创建管理者对象:游戏系统GamSystem。

// 管理者对象 - 游戏系统,管理存档,每个level只允许有一份存档
public class GameSystem {
    private List<ProcessFile> processFileList = new ArrayList<>();
​
    // 获取存档
    public ProcessFile getProcessFile(int index) {
        return processFileList.get(index);
    }
​
    // 保存存档
    public void addProcessFile(ProcessFile processFile) {
        processFileList.add(processFile);
        System.out.println("游戏存档成功:关卡" + processFile.getLevel());
    }
}

4.客户端演示存档和读取存档

public class Client {
    public static void main(String[] args) {
        GameProcess gameProcess = new GameProcess();
        GameSystem gameSystem = new GameSystem();
​
        gameProcess.setLevel("1-1"); // 关卡1-1并没有存档
        gameProcess.setLevel("1-2"); // 关卡1-2是index为0的存档
        gameSystem.addProcessFile(gameProcess.createProcessFile());
        gameProcess.setLevel("1-3");
        gameSystem.addProcessFile(gameProcess.createProcessFile());
        gameProcess.setLevel("1-4");
        gameSystem.addProcessFile(gameProcess.createProcessFile());
​
        System.out.println("当前关卡:" + gameProcess.getLevel());
        // 读取存档关卡1-3重玩,存档的index为1
        gameProcess.restoreProcessFile(gameSystem.getProcessFile(1));
        System.out.println("当前关卡:" + gameProcess.getLevel());
    }
}

应用场景

  1. 当需要保存和恢复对象的内部状态,并且不希望暴露对象的实现细节时,可以考虑使用备忘录模式。

  2. 当需要实现对象的撤销和恢复功能时,备忘录模式非常有用。

  3. 当需要在不破坏对象封装性的前提下,保存对象状态的历史记录时,备忘录模式可以帮助实现这一功能。

本质

        备忘录模式的本质是捕获对象的内部状态,并将其封装在备忘录对象中,以便之后能够恢复对象的状态。

涉及设计原则

  1. 单一职责原则(Single Responsibility Principle):备忘录模式将状态管理的职责与发起人对象分离,符合单一职责原则。

相关设计模式

  • 备忘录模式通常与命令模式(Command Pattern)结合使用,以实现撤销和恢复功能。备忘录对象可以用于保存命令执行前的状态,当需要撤销时,可以使用备忘录对象来恢复状态。

应用示例

  1. 文本编辑器:文本编辑器可以使用备忘录模式来实现撤销和恢复功能,保存不同时间点的文本内容。

  2. 游戏:在游戏中,备忘录模式可以用于保存游戏状态,以便玩家可以在需要时恢复到之前的游戏状态。

  3. 数据库事务:数据库管理系统可以使用备忘录模式来保存事务的状态,以便在事务回滚时恢复到之前的状态。

  4. 版本控制系统:版本控制系统(如Git)使用备忘录模式来记录文件或代码库的历史状态,以实现版本回滚和分支管理等功能。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elaine202391

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值