Python版

https://github.com/faif/python-patterns/blob/master/behavioral/memento.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- """
http://code.activestate.com/recipes/413838-memento-closure/ *TL;DR80
Provides the ability to restore an object to its previous state.
""" from copy import copy
from copy import deepcopy def memento(obj, deep=False):
state = deepcopy(obj.__dict__) if deep else copy(obj.__dict__) def restore():
obj.__dict__.clear()
obj.__dict__.update(state) return restore class Transaction(object):
"""A transaction guard. This is, in fact, just syntactic sugar around a memento closure.
"""
deep = False
states = [] def __init__(self, deep, *targets):
self.deep = deep
self.targets = targets
self.commit() def commit(self):
self.states = [memento(target, self.deep) for target in self.targets] def rollback(self):
for a_state in self.states:
a_state() 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 Exception as e:
state()
raise e 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 do_stuff(self):
self.value = '1111' # <- invalid value
self.increment() # <- will fail and rollback if __name__ == '__main__':
num_obj = NumObj(-1)
print(num_obj) a_transaction = Transaction(True, num_obj)
try:
for i in range(3):
num_obj.increment()
print(num_obj)
a_transaction.commit()
print('-- committed') for i in range(3):
num_obj.increment()
print(num_obj)
num_obj.value += 'x' # will fail
print(num_obj)
except Exception as e:
a_transaction.rollback()
print('-- rolled back')
print(num_obj) print('-- now doing stuff ...')
try:
num_obj.do_stuff()
except Exception as e:
print('-> doing stuff failed!')
import sys
import traceback traceback.print_exc(file=sys.stdout)
print(num_obj) ### OUTPUT ###
# <NumObj: -1>
# <NumObj: 0>
# <NumObj: 1>
# <NumObj: 2>
# -- committed
# <NumObj: 3>
# <NumObj: 4>
# <NumObj: 5>
# -- rolled back
# <NumObj: 2>
# -- now doing stuff ...
# -> doing stuff failed!
# Traceback (most recent call last):
# File "memento.py", line 97, in <module>
# num_obj.do_stuff()
# File "memento.py", line 52, in transaction
# raise e
# File "memento.py", line 49, in transaction
# return self.method(obj, *args, **kwargs)
# File "memento.py", line 70, in do_stuff
# self.increment() # <- will fail and rollback
# File "memento.py", line 65, in increment
# self.value += 1
# TypeError: Can't convert 'int' object to str implicitly
# <NumObj: 2>

Python转载版

【编程思想】【设计模式】【行为模式Behavioral】备忘录模式Memento的更多相关文章

  1. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  2. Java设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  3. Java设计模式(15)备忘录模式(Memento模式)

    Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...

  4. 【设计模式 - 18】之备忘录模式(Memento)

    1      模式简介 备忘录模式的定义: 备忘录模式保存一个对象的某个状态,以便在适当的时候恢复对象,用作"后悔药",即取消上次操作或返回到以前的某个版本. 备忘录模式的应用实例 ...

  5. Head First 设计模式系列之二----备忘录模式(java版)

    申明:这几天无意中关注到备忘录模式,比较陌生回家一番参考书,只在附录里记录了该模式.后来在园子里有发现了有专门写设计模式的博客,并且写的也得牛逼.附上链接 http://www.cnblogs.com ...

  6. 设计模式20---设计模式之备忘录模式(Memento)(行为型)

    1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...

  7. 设计模式的征途—20.备忘录(Memento)模式

    相信每个人都有后悔的时候,但是人生并无后悔药,有些错误一旦发生就无法再挽回,有些事一旦错过就不会再重来,有些话一旦说出口也就不可能再收回,这就是人生.为了不让自己后悔,我们总是需要三思而后行.这里我们 ...

  8. 设计模式---状态变化模式之备忘录模式(Memento)

    一:概念 用于保存对象的内部状态,并在需要的时候(undo/rollback)回复对象以前的状态 二:应用场景 如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以 ...

  9. IOS设计模式第九篇之备忘录模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 备忘录模式捕获和具体化对象的内部状态.换句话说,它可以节省你的东西后来,这种外部状态可以恢复在不违反封装; 也就是说,私人数据是私有的. 怎么用备忘 ...

  10. 设计模式 --> (13)备忘录模式

    备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态 示例 玩游戏时都会保存进度,所保存的进度以文件的形式存在.这样下次就可 ...

随机推荐

  1. JMeter跨线程组保持登录(多线程组共享cookie)

    使用__setProperty设置全局变量: 1.jmeter中创建一个登录请求,然后执行,察看结果树-->查看返回cookie信息,我的是在Response data中的 Response h ...

  2. vue中main.js配置后端请求地址

    Vue.config.productionTip = false; axios.defaults.baseURL = 'http://127.0.0.1:8003/';//后端开发环境地址 // ax ...

  3. 设计系统(Design System),设计和开发之间的“DevOps”

    最近,我们网站的上新增了几个新功能,比如通过导航栏的QR Code可以下载App:通过Carousel的方式,显示多条信息. 以往这样的功能可能需要2-3个Sprints完成,但是现在这些功能都是在一 ...

  4. MySQL基础语句(查询)

    students表 id class_id name gender score 1 1 小明 M 90 2 1 小红 F 95 3 1 小军 M 88 4 1 小米 F 73 5 2 小白 F 81 ...

  5. SpringCloud升级之路2020.0.x版-36. 验证断路器正确性

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 上一节我们通过单元测试验证了线程隔离的正确性,这一节我们来验证我们断路器的正确性,主要包括 ...

  6. python中整除后结果也是小数

    有人这么回答,这显然不对 先看个例子: '//'明明是整除,为什么结果不是整数,而会出现小数? 首先,关于除法有三种概念:传统除法.精确除法和地板除 #1.传统除法:整数相除结果是整数,浮点数相除结果 ...

  7. PAT A1020——已知后序中序遍历求层序遍历

    1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Give ...

  8. [cf1491H]Yuezheng Ling and Dynamic Tree

    将其按照区间分块(即$[(i-1)K+1,iK]$作为一个块),并定义$f_{x}$表示$x$的祖先中编号最小且与$x$在同一个块内的节点,$f_{x}$可以通过$f_{a_{x}}$转移,即$f_{ ...

  9. 微信小程序的优点(水一篇)

    - 快速的加载 - 更强大的能力 - 原生的体验 - 易用且安全的微信数据开放 - 高效和简单的开发 摘自微信官方文档 https://developers.weixin.qq.com/minipro ...

  10. jenkins cron

    1. Jenkins cron syntax Jenkins Cron 语法遵循Cron实用程序的语法(略有不同)具体来说,每行包含由TAB或SPACE分隔的5个字段(分时日月周): 分钟(Minut ...