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

5 阅读4分钟

前言

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

一、概述

何为备忘录设计模式?

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

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

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

备忘备忘,何时使用呢?

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

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

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

二、案例

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

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

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

  • Commit
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
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
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);
    }
}

测试类

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();
    }
}

输出

Current code:
public class Main { ... }

三、小结

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

优点:

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

缺点:

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

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