备忘录模式
备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。
介绍
-
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
-
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
-
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态。
-
应用实例: 1、打游戏时的存档。 2、Windows 里的 ctrl + z。 3、浏览器中的后退。 4、数据库的事务管理。
实现
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。
java
步骤 1
创建 Memento 类。
Memento.java
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
步骤 2
创建 Originator 类。
Originator.java
public class Originator {
private String state;
public void setState(String state){
this.state = state;
}
public String getState(){
return state;
}
public Memento saveStateToMemento(){
return new Memento(state);
}
public void getStateFromMemento(Memento Memento){
state = Memento.getState();
}
}
步骤 3
创建 CareTaker 类。
CareTaker.java
import java.util.ArrayList;
import java.util.List;
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state){
mementoList.add(state);
}
public Memento get(int index){
return mementoList.get(index);
}
}
步骤 4
使用 CareTaker 和 Originator 对象。
MementoPatternDemo.java
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
步骤 5
验证输出。
Current State: State #4
First saved State: State #2
Second saved State: State #3
rust
rust的实现和java的实现大致一样,就不再赘述了
// 设置备忘录类
#[derive(Clone)]
struct Memento{
state:String
}
// 设置创始类
struct Originator{
state:String,
}
impl Originator {
fn save_state_to_memento(&self)->Memento{
Memento { state: self.state.clone() }
}
fn get_state_from_memento(&mut self,memento:Memento){
self.state=memento.state.clone();
}
}
// 创建看护人类
struct CareTaker{
memento_list:Vec<Memento>
}
impl CareTaker {
fn add(&mut self,memento:Memento){
self.memento_list.push(memento);
}
fn get(&self,index:usize)->Memento{
self.memento_list.get(index).unwrap().clone()
}
}
fn main() {
let mut originator=Originator{state:"State #1".to_owned()};
let mut careTaker =CareTaker{memento_list:vec![]};
originator.state=String::from("State #2");
careTaker.add(originator.save_state_to_memento());
originator.state=String::from("State #3");
careTaker.add(originator.save_state_to_memento());
originator.state=String::from("State #4");
println!("Current State: {}",originator.state);
originator.get_state_from_memento(careTaker.get(0));
println!("First saved State: {}",originator.state);
originator.get_state_from_memento(careTaker.get(1));
println!("Second saved State: {}",originator.state)
}
rust仓库
https://github.com/onenewcode/design.git
本教程项目在bin文件夹下的mediator.rs文件中