作者:云都小生
概述
许多软件都提供了这样一种功能—— 撤销,这是我们一直在用,且非常重要的一个功能。在软件设计中,我们通常也会设计这样一种功能,而“撤回”功能的一种实现机制就是—— 备忘录模式。
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
在备忘录模式中,通常有下面这些角色:原发者、备忘录、负责人。
原发者:我们会将那些需要进行备份、需要保存内部状态的类,设计成原发者,原发者能够创建备忘录。
备忘录:备忘录用于存放原发者的内部状态,备忘录对象一般只能由原发者和负责人类调用,不能被其他类访问、操作。
负责人:负责保存备忘录,不能对备忘录进行操作。一个负责人类能存储一个或多个备忘录对象。
单个备份的案例
单个备份是“只撤销一次”的意思,我们来看这个案例。
//原发者
public class Original
{
private String state;
Original(String state)
{
this.state = state;
}
public Backup CreateBackup()
{
return new Backup(this);
}
public void RefBackup(Backup b)
{
state = b.state;
}
public void SetState(String state)
{
this.state = state;
}
public String GetState()
{
return state;
}
}
//备忘录
public class Backup {
public String state;
Backup(Original o)
{
this.state = o.GetState();
}
public void SetState(String state)
{
this.state = state;
}
public String GetState()
{
return this.state;
}
}
//负责人
public class BackupManager
{
private Backup backup;
public Backup GetBackup()
{
return backup;
}
public void SetBackup(Backup backup)
{
this.backup = backup;
}
}
//测试类
public class Test
{
public static void main(String[] args) {
Original original = new Original("版本1");
Backup backup = original.CreateBackup();
BackupManager manager = new BackupManager();
manager.SetBackup(backup);
original = new Original("版本2");
original.RefBackup(manager.GetBackup());
System.out.println(original.GetState());
}
}
通常备忘录的设计都是跟原发类类似,因为它要保存原发类的状态(通常存放属性)。
多个备份的案例
有时候,我们只希望提供撤销一次的功能,但是有些时候,我们希望提供能够撤销好多次的功能,这个时候怎么办?
基本的设计框架没有什么变化,就是改两个地方。
//负责人
public class BackupManager {
private ArrayList<Backup> backupList = new ArrayList();
public Backup GetBackup(int i) {
return (Backup)backupList.get(i);
}
public void AddBackup(Backup backup) {
backupList.add(backup);
}
}
负责人是负责存储备忘录,我们可以在这个地方,用集合来存放。
public class Test {
public static void main(String[] args) {
Original original = new Original("版本1");
Backup backup = original.CreateBackup();
BackupManager manager = new BackupManager();
manager.AddBackup(backup);
original = new Original("版本2");
original.RefBackup(manager.GetBackup(0));
System.out.println(original.GetState());
}
}
在客户端也要进行相应的修改。
总结
备忘录模式可以实现“撤回”的这种功能,但是缺点在于,这样很消耗资源。
2018/2/27 16:28:14 @Author:云都小生