备忘录模式(Memento Pattern)

备忘录模式在游戏中很好理解,你在某个时间存了一份自己觉得完美的存档,但你要试试看看再让它更完美一点自己会不会挂掉,而不幸的是你挂了。那么你翻存档的时候发现还有一个存档,通过存档就像时间倒流一样回到了那个游戏节点。备忘录模式就是做这个用途的。

备忘录模式的实例

首先我们需要定义备忘录和它的状态。

  1. class Memento {
  2. constructor(state){
  3. this.state = state;
  4. }
  5. getState(){
  6. return this.state;
  7. }
  8. }

通过发起人来获取需要保存的备忘录或者是还原出需要还原的状态

  1. class Originator {
  2. setState(state){
  3. this.state = state;
  4. }
  5. getState(){
  6. return this.state;
  7. }
  8. saveStateToMemento(){
  9. return new Memento(this.state);
  10. }
  11. getStateFromMemento(memento){
  12. this.state = memento.getState();
  13. }
  14. }

通过守护者来记录存档,或者是获取存档

  1. class CareTaker {
  2. constructor() {
  3. this.mementoList = [];
  4. }
  5. add(state){
  6. this.mementoList.push(state);
  7. }
  8. get(index){
  9. return this.mementoList[index];
  10. }
  11. }

通过发起人和守护者来实现,备忘录的还原或保存。

  1. const originator = new Originator();
  2. const careTaker = new CareTaker();
  3. originator.setState("State #1");
  4. originator.setState("State #2");
  5. careTaker.add(originator.saveStateToMemento());
  6. originator.setState("State #3");
  7. careTaker.add(originator.saveStateToMemento());
  8. originator.setState("State #4");
  9. console.log("Current State: " + originator.getState());
  10. originator.getStateFromMemento(careTaker.get(0));
  11. console.log("First saved State: " + originator.getState());
  12. originator.getStateFromMemento(careTaker.get(1));
  13. console.log("Second saved State: " + originator.getState());
  14. /**
  15. * output:
  16. * Current State: State #4
  17. * First saved State: State #2
  18. * Second saved State: State #3
  19. */

备忘录模式的优势

可以说在编程中需要时光倒流的某些事件的一种最佳实践,通过备忘录模式来做类似的事情。

上一页(中介者模式)

下一页(观察者模式)