Python设计模式:备忘录模式

238 阅读1分钟
原文链接: zhuanlan.zhihu.com

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

说通俗点就相当于一个游戏存档,一般我们玩游戏打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}")

④ 开始冒险之旅

  1. 新英雄登场,存档一次
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()