设计模式十七备忘录模式:边学边做个生成电子书的工具(python+dart)

269 阅读2分钟

意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

image.png 如何解决:通过一个备忘录类专门存储对象状态。

python 代码

import random


class zombie:
    goldCoin = 0  # 金币数量
    sun = 0  # 阳光数量
    teWuBean = 0  # 特务豌豆射手数量
    goldenSunflower = 0  # 金属向日葵数量
    icyIceCactus = 0  # 寒冰仙人掌数量

    def disState(self):
        print('zombie game current status is as below:')
        print('goldCoin : {}'.format(self.goldCoin))
        print('sun : {}'.format(self.sun))
        print('teWuBean : {}'.format(self.teWuBean))
        print('goldenSunflower : {}'.format(self.goldenSunflower))
        print('icyIceCactus : {}'.format(self.icyIceCactus))

    def initState(self, goldCoin, sun, teWuBean, goldenSunflower, icyIceCactus):
        self.goldCoin = goldCoin
        self.sun = sun
        self.teWuBean = teWuBean
        self.goldenSunflower = goldenSunflower
        self.icyIceCactus = icyIceCactus

    def saveState(self):
        return memo(self.goldCoin, self.sun, self.teWuBean, self.goldenSunflower, self.icyIceCactus)

    def recoverState(self, memo):
        self.goldCoin = memo.goldCoin
        self.sun = memo.sun
        self.teWuBean = memo.teWuBean
        self.goldenSunflower = memo.goldenSunflower
        self.icyIceCactus = memo.icyIceCactus


class fightState(zombie):
    def fight(self):
        self.goldCoin = random.randint(1000, 100000)
        self.sun = random.randint(1000, 100000)
        self.teWuBean = random.randint(1, 10)
        self.goldenSunflower = random.randint(1, 10)
        self.icyIceCactus = random.randint(1, 10)


class memo():
    goldCoin = 0
    sun = 0
    teWuBean = 0
    goldenSunflower = 0
    icyIceCactus = 0

    def __init__(self, goldCoin, sun, teWuBean, goldenSunflower, icyIceCactus):
        self.goldCoin = goldCoin
        self.sun = sun
        self.teWuBean = teWuBean
        self.goldenSunflower = goldenSunflower
        self.icyIceCactus = icyIceCactus


if __name__ == "__main__":
    curState = fightState()
    curState.initState(10000, 9000, 10, 10, 10)
    print('现在植物大战僵尸游戏第8关已通关,马上开始打第9关了,目前游戏参数值如下:')
    curState.disState()
    state8 = curState.saveState()
    curState.fight()
    print('越是往后关卡越难,第9关打完了了,真是惨不忍睹,目前参数值如下:')
    curState.disState()
    print('完败呀,只能重打了,恢复到第8关通关的参数吧,恢复如下')
    curState.recoverState(state8)
    curState.disState()
    print('恢复完了,再开始第9关吧')

dart 代码

class Memento {
  String _state;
  Memento(this._state);
  String getState() {
    return _state;
  }
}

class Originator {
  late String _state;
  void setState(String state) {
    this._state = state;
  }

  String getState() {
    return _state;
  }

  Memento saveStateToMemento() {
    return Memento(_state);
  }

  void getStateFromMemento(Memento memento) {
    _state = memento.getState();
  }
}

class CareTaker {
  List<Memento> _mementoList = <Memento>[];
  void add(Memento state) {
    _mementoList.add(state);
  }

  Memento get(int index) {
    return _mementoList[index];
  }
}

main(List<String> args) {
  Originator originator = Originator();
  CareTaker careTaker = 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");
  print("Current State: ${originator.getState()}");

  originator.getStateFromMemento(careTaker.get(0));
  print("First saved State: ${originator.getState()}");

  originator.getStateFromMemento(careTaker.get(1));
  print("Second saved State: ${originator.getState()}");
}



// Current State: State #4
// First saved State: State #2
// Second saved State: State #3