意图:

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

适用性:

必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。

如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

#!/usr/bin/python
#coding:utf8
'''
Memento
''' import copy def Memento(obj, deep=False):
state = (copy.copy, copy.deepcopy)[bool(deep)](obj.__dict__) def Restore():
obj.__dict__.clear()
obj.__dict__.update(state)
return Restore class Transaction:
"""A transaction guard. This is really just
syntactic suggar arount a memento closure.
"""
deep = False def __init__(self, *targets):
self.targets = targets
self.Commit() def Commit(self):
self.states = [Memento(target, self.deep) for target in self.targets] def Rollback(self):
for st in self.states:
st() class transactional(object):
"""Adds transactional semantics to methods. Methods decorated with
@transactional will rollback to entry state upon exceptions.
"""
def __init__(self, method):
self.method = method def __get__(self, obj, T):
def transaction(*args, **kwargs):
state = Memento(obj)
try:
return self.method(obj, *args, **kwargs)
except:
state()
raise
return transaction class NumObj(object):
def __init__(self, value):
self.value = value def __repr__(self):
return '<%s: %r>' % (self.__class__.__name__, self.value) def Increment(self):
self.value += 1 @transactional
def DoStuff(self):
self.value = '' # <- invalid value
self.Increment() # <- will fail and rollback if __name__ == '__main__':
n = NumObj(-1)
print(n)
t = Transaction(n)
try:
for i in range(3):
n.Increment()
print(n)
t.Commit()
print('-- commited')
for i in range(3):
n.Increment()
print(n)
n.value += 'x' # will fail
print(n)
except:
t.Rollback()
print('-- rolled back')
print(n)
print('-- now doing stuff ...')
try:
n.DoStuff()
except:
print('-> doing stuff failed!')
import traceback
traceback.print_exc(0)
pass
print(n)

Memento(备忘录)的更多相关文章

  1. 十八、Memento 备忘录设计模式

    原理: 代码清单: Memento public class Memento { int mondey; ArrayList fruits; Memento(int mondey){ this.mon ...

  2. 设计模式(18)--Memento(备忘录模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...

  3. Memento 备忘录 快照模式 MD

    备忘录模式 简介 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供 ...

  4. 设计模式20:Memento 备忘录模式(行为型模式)

    Memento 备忘录模式(行为型模式) 对象状态的回溯 对象状态的变化无端,如何回溯.恢复对象在某个点的状态? 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某 ...

  5. 23种设计模式 - 状态变化(Memento备忘录 - State)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...

  6. C++设计模式-Memento备忘录模式

    Memento模式作用:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. UML图: Originator:负责创建一个备忘录Me ...

  7. Memento 备忘录 快照模式

    简介 定义: 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供一创 ...

  8. Memento - 备忘录模式

    定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 案例 比方如今有一个画图系统,我们在Viewer里面画了一些图形,可是在绘 ...

  9. 18、Memento 备忘录模式

    例如:用于记录快照(顺势状态).存盘 1.Memento Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...

  10. Memento(备忘录)-对象行为型模式

    1.意图 在布破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将对象恢复到原先保存的状态. 2.别名 Token 3.动机 为了允许用户取消不确定的操作或从错误中 ...

随机推荐

  1. mysql 5.7如何添加用户

    MySQL5.7 添加用户.删除用户与授权  转自:https://www.cnblogs.com/xujishou/p/6306765.html mysql -uroot -proot MySQL5 ...

  2. 熵 互信息 Gini指数 和 不纯度

    在学习决策树类的算法时,总是绕不开 信息熵.Gini指数和它们相关联的概念,概念不清楚,就很难理解决策树的构造过程,现在把这些概念捋一捋. 信息熵 信息熵,简称熵,用来衡量随机变量的不确定性大小,熵越 ...

  3. Visual Studio 2015 Enterprise - 企业版 - 简体中文

    文件名称 文件大小 百度网盘下载 微软官方下载 Visual Studio 2015 Enterprise - 企业版 - 简体中文 3.89GB http://pan.baidu.com/s/1bn ...

  4. MacBook Pro Retina 安装WIN7 - 对抗模糊及其它

    最近对虚拟机里的WIN7受够了,把整个虚拟机都删了,准备装双系统. 安装过程还是很简单的,网上教程一大堆,就是通过MAC OS X自带的BootCamp工具来管理整个安装过程,我是用外置光驱安装的,没 ...

  5. RAID和LVM磁盘阵列

    RAID磁盘冗余阵列 CPU的处理性能保持着高速增长,Intel公司在2017年最新发布的i9-7980XE处理器芯片更是达到了18核心36线程.但与此同时,硬盘设备的性能提升却不是很大,因此逐渐成为 ...

  6. kitkat-s5p4418drone 记录

      查看帮助: ./device/nexell/tools/build.sh  -h   编译u-boot: ./device/nexell/tools/build.sh -b drone2 -t u ...

  7. Intellij idea的Dependencies波浪线

    昨天在家做项目不知道搞了什么出现了大量波浪线.搞了大半天解决了下面的问题. 1.pom.xml出现波浪线.看右边 maven project-->Profiles 勾选dev 2.上面已勾选还有 ...

  8. Django之views.py详解

    http请求中产生的两个核心对象: http请求:HttpRequesthttp响应:HttpResponse 所在位置:from django.http import HttpRequest,Htt ...

  9. (2.4)DDL增强功能-数据汇总grouping、rollup、cube

    参考:https://www.cnblogs.com/nikyxxx/archive/2012/11/27/2791001.html 1.rollup (1)rollup在group by 子句中使用 ...

  10. node-schedule 实现定时任务使用方法记录

    在项目中有个每天0点执行的函数,本来想用setInterval来实现,但觉得这种需求以后应该还会有,自己写可能拓展性不高.搜了一下发现了node-schedule这个包.现在记录一下使用方法 node ...