美文网首页
设计模式 - 22.备忘录模式 [行为型模式]

设计模式 - 22.备忘录模式 [行为型模式]

作者: Zszen | 来源:发表于2020-03-27 15:00 被阅读0次
大纲 小结
基础准则 基础准则
创建型模式 单例模式
- 原型模式
- 简单工厂模式
- 抽象工厂模式
- 建造者模式
结构型模式 代理模式
- 适配器模式
- 桥接模式
- 装饰器模式
- 门面/外观模式
- 享元模式
- 组合模式
行为型模式 模板方法模式
- 策略模式
- 命令模式
- 职责链模式
- 状态模式
- 观察者模式
- 中介者模式
- 迭代器模式
- 访问者模式
- 备忘录模式
- 解释器模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

制作一个历史快照收集器, 可以存储当前游戏玩家的运动轨迹, 通过restore, 可以时光倒流玩家的运动轨迹

import abc
import random
from enum import Enum
import copy

SaveKey = Enum('SaveKey', 'gametype person_position')

class Game:
    def __init__(self):
        self.save = Save()
        self.save.setValue(SaveKey.person_position,0)

    def person_move(self):
        self.save.addValue(SaveKey.person_position, random.randint(0,10))

    def create_save(self):
        return self.save.clone()

    def restore_save(self, s:'Save'):
        self.save.restore(s)

class SaveManager:
    def __init__(self):
        self.max = 9999
        self.savePool = []

    def add(self, save:'Save'):
        self.savePool.append(save)
        if len(self.savePool)>self.max*2:
            for k in range(self.max):
                self.savePool.pop(0)

    def clear(self):
        self.savePool.clear()

    def pop(self):
        if len(self.savePool)==0:
            return None
        return self.savePool.pop()

    def hasSave(self):
        return len(self.savePool)!=0

    def last(self):
        return self.savePool[len(self.savePool)-1]

    def at(self, index:int):
        if index >= len(self.savePool) or index<0:
            return None
        return self.save[index]

class Save:
    def __init__(self):
        self.info = {}
        for k in SaveKey:
            self.info['%s'%k] = None

    def addValue(self,key:str, addValue):
        key = '%s'%key
        if key not in self.info or self.info[key] is None:
            self.info[key] = 0
        self.info[key]+=addValue

    def getValue(self,key:str):
        key = '%s'%key
        if key not in self.info:
            return None
        return self.info[key]

    def setValue(self, key:str, value):
        key = '%s'%key
        self.info[key] = value

    def clone(self):
        s = Save()
        s.info = copy.deepcopy(self.info)
        return s

    def restore(self, s:'Save'):
        self.info = copy.deepcopy(s.info)
    

if __name__ == '__main__':
    game = Game()
    saver = SaveManager()
    saver.add(game.create_save())
    print(game.save.getValue(SaveKey.person_position))
    for k in range(10):
        game.person_move()
        saver.add(game.create_save())
        print(game.save.getValue(SaveKey.person_position))
    for k in range(11):
        if saver.hasSave():
            game.restore_save(saver.pop())
            print(game.save.getValue(SaveKey.person_position))
        else:
            break

结果

0
5
6
16
23
25
26
35
44
50
58
58
50
44
35
26
25
23
16
6
5
0

相关文章

网友评论

      本文标题:设计模式 - 22.备忘录模式 [行为型模式]

      本文链接:https://www.haomeiwen.com/subject/glgxuhtx.html