前言
陆陆续续写了两年的设计模式终于来到最后一篇了,这个系列暂时结束,后面再来总结~
一、概述
何为备忘录设计模式?
备忘录设计模式类似于存档,也称为快照模式,经常我们在发布的时候,会把原来的 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 { ... }
三、小结
备忘录设计模式是一种行为设计模式,用于捕获对象的内部状态并在不破坏对象封装性的情况下将其保存,以便将来可以恢复到先前的状态。这种设计模式通常用于需要保存和恢复对象状态的情况,例如撤销操作、历史记录管理等。
优点:
- 简化了对象状态的保存和恢复过程,使得代码更加清晰和易于维护。
- 可以帮助实现撤销和恢复功能,提高系统的灵活性和可扩展性。
- 能够保持对象的封装性,客户端不需要了解对象的具体实现细节。
缺点:
- 如果备忘录对象过多或者状态信息过大,可能会消耗大量的内存空间。
- 备忘录对象的创建和管理可能会增加系统的复杂性。
- 如果备忘录对象的访问权限不当,可能会破坏对象的封装性。
总结:备忘录设计模式是一种非常有用的设计模式,可以帮助我们保存和恢复对象的状态信息,实现撤销和恢复功能。在实际应用中,需要根据具体情况权衡利弊,避免备忘录对象过多或者状态信息过大,以确保系统的性能和可维护性。