文章目录
- 备忘录模式
- 介绍
- 实现
- java
- rust
- rust仓库
备忘录模式
备忘录(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文件中