标签:sch cursor oschina 并且 targe 哪些 多个 ctr width
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
备忘录模式也算是设计模式中,几个比较简单的设计模式之一。它的目的是用于保存对象当前的状态,并且在之后可以再次恢复到此状态。
举个例子:就好比文本编辑器软件,每次输入文本后,都可以使用【Ctrl + Z】进行回退。可以想想成每次输入文本后,文本编辑器就保存了一个状态,使用回退可以按照输入顺序进行取消刚才的输入。这就可以理解为备忘录模式的使用场景,当有需要时,保存对象的状态到一个副本中(快照),并提供撤销功能(回退)将当前对象撤销到某个快照中。
还是通过一个需求进行描述,项目中需要一个好友列表模块,需要如下功能:
实现类图如下:
创建一个Friend对象,用于实现需求要求的功能,并且提供生成备忘录(快照),和回退的功能。
创建一个Memento对象,用于保存Friend中的nameList,这个对象与Friend对象在同一个包下,所以他的访问级别是包访问级别。
具体代码如下:
// 好友列表对象
public class Friend {
private List<String> nameList = new ArrayList<>();
// 添加朋友
public void add(String name) {
nameList.add(name);
}
// 删除朋友
public void remove(String name) {
nameList.remove(name);
}
// 打印好友列表
public void print() {
System.out.println(this.nameList.toString());
}
// 创建备忘录
public Memento createMemento() {
return new Memento(new ArrayList<>(nameList));
}
// 撤回到备忘录
public void restore(Memento memento) {
this.nameList = memento.getNameList();
}
}
/**
* 备忘录。
*/
public class Memento {
private List<String> nameList = new ArrayList<>();
// 构造函数
// 备忘录与Friend对象在头一个包下,只有Friend可以访问备忘录。
Memento(List<String> nameList) {
this.nameList = nameList;
}
// 备忘录与Friend对象在头一个包下,只有Friend可以访问备忘录。
List<String> getNameList() {
return this.nameList;
}
}
业务场景如下:
public class Client {
// 输出
// [Jack, Mark, Rose]
// [Jack, Rose]
// [Jack, Mark, Rose]
public static void main(String[] args) {
// 创建好友列表
Friend friend = new Friend();
friend.add("Jack");
friend.add("Mark");
friend.add("Rose");
friend.print();
// 创建备忘录,然后删除一个朋友
Memento memento = friend.createMemento();
friend.remove("Mark");
friend.print();
// 回退到上次的备忘录
friend.restore(memento);
friend.print();
}
}
首先要声明,要实现上面的需求有很多种方式方法,但是为什么选择备忘录模式,这么做有哪些好处,具体如下:
上面的例子中,是将备忘录保存到内存中,如果真正要使用备忘录模式,需要考虑几个问题。
一般线上的操作系统都是分布式部署的,可能创建备忘录和恢复的两次请求会打到不同的两个节点上,这是使用JVM内存就无法做到恢复,所以要考虑将备忘录存储到数据库、文件系统或者分布式缓存中。
加入我们选择将备忘录保存到数据库、文件系统或者分布式缓存中。那么,当系统升级或者需求变更的过程中,我们修改了备忘录结构,会造成持久化中的备忘录与最新的程序中的备忘录不一致。
基于这一点,需要考虑备忘录的有效期,或者当不一致时的补偿方式。
首先总结下使用场景,其实数据库连接的事务管理就是用的备忘录模式:
另外,编写备忘录对象时,要灵活使用几种访问修饰符(private protected public),保证备忘录中数据的数据安全。
以上就是我对备忘录模式的一些理解,有不足之处请大家指出,谢谢。
标签:sch cursor oschina 并且 targe 哪些 多个 ctr width
原文地址:https://www.cnblogs.com/vwvwvwgwgvervae/p/12815706.html