大纲 | 小结 |
---|---|
基础准则 | 基础准则 |
创建型模式 | 单例模式 |
- | 原型模式 |
- | 简单工厂模式 |
- | 抽象工厂模式 |
- | 建造者模式 |
结构型模式 | 代理模式 |
- | 适配器模式 |
- | 桥接模式 |
- | 装饰器模式 |
- | 门面/外观模式 |
- | 享元模式 |
- | 组合模式 |
行为型模式 | 模板方法模式 |
- | 策略模式 |
- | 命令模式 |
- | 职责链模式 |
- | 状态模式 |
- | 观察者模式 |
- | 中介者模式 |
- | 迭代器模式 |
- | 访问者模式 |
- | 备忘录模式 |
- | 解释器模式 |
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

制作一个历史快照收集器, 可以存储当前游戏玩家的运动轨迹, 通过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
网友评论