目录
一、基础概念
二、UML类图
三、角色设计
四、案例分析
五、总结
备忘录模式是一种行为型设计模式,它允许保存一个对象的内部状态到一个备忘录对象中,这样就可以在需要的时候恢复这个对象的状态了,同时又不违反封装性原则。
这个模式的核心就是备忘录对象,它负责存储目标对象的内部状态信息,并且可以通过方法访问这些状态数据。而目标对象负责创建备忘录对象,并在备忘录对象中保存自身状态。管理者角色负责存储和恢复备忘录对象,但是不能直接看到或者修改备忘录对象中的状态数据。
角色 | 描述 |
---|---|
发起人角色 | 负责创建一个备忘录,记录自身需要保存的状态,具备回滚的功能 |
备忘录角色 | 用于存储发起人角色的内部状态,而且可以防止发起人角色以外的对象访问权限 |
管理者角色 | 负责存储、提供管理备忘录角色,不可以修改备忘录角色的内容 |
在我们日常开发中,必备的版本控制工具就是Git,可以提交版本,回滚到指定版本,下面我们就通过备忘录设计模式来实现一个简单的版本控制功能,代码如下:
它扮演备忘录角色,用于存储某个时刻的状态快照。它有两个成员变量version和content,分别记录版本号和内容:
public class Commit {
private String version;
private String content;
public Commit(String version, String content) {
this.version = version;
this.content = content;
}
public String getVersion() {
return version;
}
public String getContent() {
return content;
}
}
Repository类是发起人角色,它管理具体的内容。该类有一个成员变量content记录内容,以及setContent和getContent方法用于设置和获取内容。另外还有一个commit方法可以保存一个状态快照,和一个rollback方法可以从快照恢复状态。
public class Repository {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Commit commit(String version) {
return new Commit(version, content);
}
public void rollback(Commit commit) {
content = commit.getContent();
}
}
Git类在这里是管理者角色,它持有一个Commit对象列表来记录每次提交的备忘录。该类提供了commit和rollback两种方法,commit是保存新提交的备忘录,rollback可以回滚到指定版本。
import java.util.ArrayList;
import java.util.List;
public class Git {
private List commits = new ArrayList<>();
public void commit(Repository repo, String version) {
commits.add(repo.commit(version));
}
public void rollback(Repository repo, String version) {
for(Commit commit : commits) {
if(commit.getVersion().equals(version)) {
repo.rollback(commit);
break;
}
}
}
}
模拟一个客户端,演示了这个存储库的基本用法。首先创建Repository和Git对象,然后新增几个版本到存储库,最后回滚到第一个版本,在关键点会打印输出内容,以展示执行流程。
public class Client {
public static void main(String[] args) {
Repository repository = new Repository();
Git git = new Git();
repository.setContent("version 1");
git.commit(repository, "version 1");
repository.setContent("version 2");
git.commit(repository, "version 2");
repository.setContent("version 3");
git.commit(repository, "version 3");
git.rollback(repository, "version 1");
System.out.println(repository.getContent());
}
}
运行结果如下:
整体上这个例子使用了备忘录模式的三个主要角色,将状态存入备忘录对象,发起人负责状态的管理和保存,管理者保存备忘录的历史,从而实现了版本控制和回滚的功能。这就是一个使用备忘录模式实现简单Git版本控制的设计和执行过程。
优点:
1、提供了保持对象内部状态历史的能力,可以方便地将对象恢复到历史某个状态。
2、实现了内部状态的封装,除了创建它的发起人之外,其他对象都不能访问这些状态信息。
3、简化了发起人类,发起人不需要管理和保存其内部状态的各个历史版本,所有状态历史由管理者完成。
缺点:
1、资源消耗大,如果要保存的历史状态很多,会占用较多内存资源。
2、破坏了对象的封装性,其他对象可以通过管理者访问发起人的内部状态。
3、复杂度较高,需要维护发起人、备忘录、管理者三个角色对象。
应用场景:
1、需要保存对象在某个时刻的状态快照,比如实现撤销操作。
2、需要对对象的状态历史保持跟踪,如游戏进度保存。
3、当对象的状态变化复杂时,可以使用备忘录模式保持对象内部状态的一致性。
4、当直接访问封装的对象需要暴露对象实现细节时,可以通过备忘录间接访问对象状态。
符合的设计原则:
1、开闭原则(Open Close Principle)
开闭原则要求软件实体应对扩展开放,对修改关闭。备忘录模式通过创建新的备忘录类来保存和恢复对象状态,扩展了现有类的功能,而无需修改这些类的代码。符合了对扩展开放的要求。
2、封装原则(Encapsulation Principle)
封装原则要求隐藏实现细节,只通过公共接口提供访问。在备忘录模式中,备忘录类封装了对象状态,外部只能通过备忘录的限定接口访问,不能直接操作对象的内部状态,提高了封装性。
3、单一职责原则(Single Responsibility Principle)
单一职责原则要求一个类只有一个引起它变化的原因。备忘录模式中,原发器类负责业务逻辑,备忘录类负责存储状态,管理者类负责备忘录的管理,每一个类都只有单一职责。