备忘录模式
备忘录(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文件中