备忘录模式是指在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
说通俗点就相当于一个游戏存档,一般我们玩游戏打BOSS前,都会保存一下,如果打BOSS失败了就读取存档再来一遍,这里面有三个对象,英雄,你控制的游戏角色,存档,用来保存英雄的状态数据,存档管理员,帮你执行保存和读取的工作。
① 状态备忘录
也就是你的存档,用来保存英雄的状态(攻击力和防御力)。
class StatusMemento:
def __init__(self, attack, defense):
self.attack = attack
self.defense = defense
def __str__(self):
return f"存档:攻击力:{self.attack}, 防御力:{self.defense}"
def __repr__(self):
return f"攻击力:{self.attack}, 防御力:{self.defense}"
② 英雄
你的用的游戏主角,会受伤,能存档也能恢复存档。
class Hero:
def __init__(self, attack, defense):
self.attack = attack
self.defense = defense
def get_injured(self):
self.attack = 50
self.defense = 50
print("英雄受伤了")
def save_status(self):
print("存档")
return StatusMemento(self.attack, self.defense)
def recover_status(self, status):
print("恢复存档")
self.attack = status.attack
self.defense = status.defense
def current_status(self):
print(f"角色的当前状态为 攻击力:{self.attack}, 防御力:{self.defense}")
③ 状态备忘录管理员
你的存档管理员,专门有个小本本记录的英雄的所有状态,当你需要存档的时候,把当前状态给他记录,当你需要恢复存档的时候,问他要之前的记录。
class Caretaker:
statuses = {}
num = 0
@classmethod
def add(cls, status):
cls.num += 1
print(f"存档增加状态 --- {status} ---")
s = {cls.num: status}
cls.statuses.update(s)
@classmethod
def current_statuses(cls):
print(f"当前所有存档为 {cls.statuses}")
④ 开始冒险之旅
- 新英雄登场,存档一次
hero = Hero(100, 100)
hero.current_status()
Caretaker.add(hero.save_status())
2. 英雄受伤了,存档一次
hero.get_injured()
hero.current_status()
Caretaker.add(hero.save_status())
3. 恢复存档
Caretaker.current_statuses()
hero.recover_status(Caretaker.statuses[1]) # 恢复到第一个存档
hero.current_status()
hero.recover_status(Caretaker.statuses[2]) # 恢复到第二个存档
hero.current_status()