【浅谈设计模式】(22):备忘录模式 | 代码管理

前言

陆陆续续写了两年的设计模式终于来到最后一篇了,这个系列暂时结束,后面再来总结~

一、概述

何为备忘录设计模式?

备忘录设计模式类似于存档,也称为快照模式,经常我们在发布的时候,会把原来的 jar 程序进行一个备份存档,遇到不对劲的地方就可以恢复操作,备忘录模式就是这个道理。

备忘录模式是一种行为设计模式,用于捕获对象的内部状态,并在不破坏封装性的情况下将其保存,以便将来可以恢复到先前的状态。

在这个设计模式中,需要有一个对象称为备忘录对象来存储对象的状态信息,并提供一种方法恢复对象当前的状态。

备忘备忘,何时使用呢?

当遇到允许用户取消不确定或者错误的操作,能够恢复到他原先的状态的时候,给他一颗后悔药可吃的场景下,就可以使用备忘录模式,当然实际场景下几乎用不上这个设计模式。

备忘录模式主要有如下角色:

  • 发起人角色(Originator):记录当前时刻的内部状态,提供创建备忘录和恢复备忘录的功能,实现其他业务功能,可以访问备忘录里面的所有信息
  • 备忘录角色(Memento):负责存储发起人的内部状态,在需要的时候提供这些状态给发起人
  • 管理者角色(Caretaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

二、案例

以掘金博客论坛为例,在发表文章的时候,如果点击存入到草稿箱,下次就可以进入草稿箱进行二次编辑,这就相当于一次存档。当然备忘录模式更明显的是 git 备份,每次的操作都会在 git 中记录下时间、修改内容,以便代码可以回滚到任何一个状态。

说明
Commit 备忘录角色,用于保存代码的状态信息
Git 发起人角色,负责创建和代码保存提交
Repository 管理者角色,对代码分支进行管理

在这个示例中,我们模拟了一个简单的Git代码存档系统。Git类负责创建和保存代码提交,Repository类负责保存和管理代码提交的历史记录。通过使用备忘录设计模式,我们可以轻松地保存和恢复代码的状态信息,实现代码存档的功能。

  • Commit
typescript 复制代码
public class Commit {
    private String message;
    private String code;

    public Commit(String message, String code) {
        this.message = message;
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public String getCode() {
        return code;
    }
}
  • Git
typescript 复制代码
public class Git {
    private String currentBranch;
    private String currentCode;
    private List<Commit> commits = new ArrayList<>();

    public void createCommit(String message, String code) {
        currentCode = code;
        commits.add(new Commit(message, code));
    }

    public Commit save() {
        return new Commit("Save point", currentCode);
    }

    public void restore(Commit commit) {
        currentCode = commit.getCode();
    }

    public void display() {
        System.out.println("Current code:");
        System.out.println(currentCode);
    }
}
  • Repository
csharp 复制代码
public class Repository {
    private List<Commit> commits = new ArrayList<>();

    public void addCommit(Commit commit) {
        commits.add(commit);
    }

    public Commit getCommit(int index) {
        return commits.get(index);
    }
}

测试类

java 复制代码
public class Client {
    public static void main(String[] args) {
        Git git = new Git();
        Repository repository = new Repository();

        // 创建提交
git.createCommit("Initial commit", "public class Main { ... }");

        // 保存提交到历史记录
repository.addCommit(git.save());

        // 修改代码
git.createCommit("Add new feature", "public class Main { ... new code ... }");

        // 保存修改后的提交到历史记录
repository.addCommit(git.save());

        // 恢复到先前的状态
git.restore(repository.getCommit(0));

        // 显示恢复后的代码
git.display();
    }
}

输出

kotlin 复制代码
Current code:
public class Main { ... }

三、小结

备忘录设计模式是一种行为设计模式,用于捕获对象的内部状态并在不破坏对象封装性的情况下将其保存,以便将来可以恢复到先前的状态。这种设计模式通常用于需要保存和恢复对象状态的情况,例如撤销操作、历史记录管理等。

优点:

  1. 简化了对象状态的保存和恢复过程,使得代码更加清晰和易于维护。
  2. 可以帮助实现撤销和恢复功能,提高系统的灵活性和可扩展性。
  3. 能够保持对象的封装性,客户端不需要了解对象的具体实现细节。

缺点:

  1. 如果备忘录对象过多或者状态信息过大,可能会消耗大量的内存空间。
  2. 备忘录对象的创建和管理可能会增加系统的复杂性。
  3. 如果备忘录对象的访问权限不当,可能会破坏对象的封装性。

总结:备忘录设计模式是一种非常有用的设计模式,可以帮助我们保存和恢复对象的状态信息,实现撤销和恢复功能。在实际应用中,需要根据具体情况权衡利弊,避免备忘录对象过多或者状态信息过大,以确保系统的性能和可维护性。

相关推荐
zs宝来了20 分钟前
Playwright 自动发布 CSDN 的完整实践
java
吴声子夜歌1 小时前
TypeScript——基础类型(三)
java·linux·typescript
GetcharZp2 小时前
Git 命令行太痛苦?这款 75k Star 的神级工具,让你告别“合并冲突”恐惧症!
后端
Victor3562 小时前
MongoDB(69)如何进行增量备份?
后端
Victor3563 小时前
MongoDB(70)如何使用副本集进行备份?
后端
DynamicsAgg3 小时前
企业数字化底座-k8s企业实践系列第二篇pod创建调度
java·容器·kubernetes
千寻girling3 小时前
面试官 : “ 说一下 Python 中的常用的 字符串和数组 的 方法有哪些 ? ”
人工智能·后端·python
森林里的程序猿猿3 小时前
并发设计模式
java·开发语言·jvm
222you3 小时前
四个主要的函数式接口
java·开发语言