亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

Python設計模式編程中的備忘錄模式與對象池模式示例

2020-01-24 01:17:11
字體:
來源:轉載
供稿:網友

Memento備忘錄模式
備忘錄模式一個最好想象的例子:undo! 它對對象的一個狀態進行了'快照', 在你需要的時候恢復原貌。做前端會有一個場景:你設計一個表單,當點擊提交會對表單內容 驗證,這個時候你就要對用戶填寫的數據復制下來,當用戶填寫的不正確或者格式不對等問題, 就可以使用快照數據恢復用戶已經填好的,而不是讓用戶重新來一遍,不是嘛?

python的例子
這里實現了一個事務提交的例子

import copydef Memento(obj, deep=False):  # 對你要做快照的對象做快照  state = (copy.copy if deep else copy.deepcopy)(obj.__dict__)  def Restore():    obj.__dict__ = state  return Restoreclass Transaction:  deep = False  def __init__(self, *targets):    self.targets = targets    self.Commit()  # 模擬事務提交,其實就是初始化給每個對象往self.targets賦值  def Commit(self):    self.states = [Memento(target, self.deep) for target in self.targets]  # 回滾其實就是調用Memento函數,執行其中的閉包,將__dict__恢復  def Rollback(self):    for state in self.states:      state()# 裝飾器的方式給方法添加這個事務的功能def transactional(method):  # 這里的self其實就是要保存的那個對象,和類的實例無關  def wrappedMethod(self, *args, **kwargs):    state = Memento(self)    try:      return method(self, *args, **kwargs)    except:      # 和上面的回滾一樣,異常就恢復      state()      raise  return wrappedMethodclass 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 = '1111'    self.Increment()if __name__ == '__main__':  n = NumObj(-1)  print n  t = Transaction(n)  try:    for i in range(3):      n.Increment()      print n    # 這里事務提交會保存狀態從第一次的-1到2    t.Commit()    print '-- commited'    for i in range(3):      n.Increment()      print n    n.value += 'x' # will fail    print n  except:    # 回滾只會回顧到上一次comit成功的2 而不是-1    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  # 第二次的異常回滾n還是2, 整個過程都是修改NumObj的實例對象  print n

注意
當你要保存的狀態很大,可能會浪費大量內存


對象池模式
在開發中,我們總是用到一些和'池'相關的東西,比如 內存池,連接池,對象池,線程池.. 這里說的對象池其實也就是一定數量已經創建好的對象的集合。為什么要用對象池? 創建對象是要付出代價的(我暫時還沒有研究過底層,只說我工作中體會的), 比如pymongo就自帶線程池,這樣用完就放回到池里再被重用,豈不是節省了創建的花費?

python的例子
我這里實現了個線程安全的簡單的對象池

import Queueimport typesimport threadingfrom contextlib import contextmanagerclass ObjectPool(object):  def __init__(self, fn_cls, *args, **kwargs):    super(ObjectPool, self).__init__()    self.fn_cls = fn_cls    self._myinit(*args, **kwargs)  def _myinit(self, *args, **kwargs):    self.args = args    self.maxSize = int(kwargs.get("maxSize",1))    self.queue = Queue.Queue()  def _get_obj(self):    # 因為傳進來的可能是函數,還可能是類    if type(self.fn_cls) == types.FunctionType:      return self.fn_cls(self.args)    # 判斷是經典或者新類    elif type(self.fn_cls) == types.ClassType or type(self.fn_cls) == types.TypeType:      return apply(self.fn_cls, self.args)    else:      raise "Wrong type"  def borrow_obj(self):    # 這個print 沒用,只是在你執行的時候告訴你目前的隊列數,讓你發現對象池的作用    print self.queue._qsize()    # 要是對象池大小還沒有超過設置的最大數,可以繼續放進去新對象    if self.queue.qsize()<self.maxSize and self.queue.empty():      self.queue.put(self._get_obj())    # 都會返回一個對象給相關去用    return self.queue.get()   # 回收  def recover_obj(self,obj):    self.queue.put(obj)# 測試用函數和類def echo_func(num):  return numclass echo_cls(object):  pass# 不用構造含有__enter__, __exit__的類就可以使用with,當然你可以直接把代碼放到函數去用@contextmanagerdef poolobj(pool):  obj = pool.borrow_obj()  try:    yield obj  except Exception, e:    yield None  finally:    pool.recover_obj(obj)obj = ObjectPool(echo_func, 23, maxSize=4)obj2 = ObjectPool(echo_cls, maxSize=4)class MyThread(threading.Thread):  def run(self):    # 為了實現效果,我搞了個簡單的多線程,2個with放在一個地方了,只為測試用    with poolobj(obj) as t:      print t    with poolobj(obj2) as t:      print tif __name__ == '__main__':  threads = []  for i in range(200):    t = MyThread()    t.start()    threads.append(t)  for t in threads:    t.join(True)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本一区二区在线播放| 久久精品国产2020观看福利| 欧美日韩亚洲一区二区| 国产精品流白浆视频| 黑人与娇小精品av专区| 国产97在线|日韩| 国产97人人超碰caoprom| 北条麻妃99精品青青久久| 97色伦亚洲国产| 国产日韩欧美91| 亚洲最大福利视频网| xxxxxxxxx欧美| 亚洲天堂av网| 亚洲人精品午夜在线观看| 国产精品网站大全| 日韩精品一二三四区| 成人av番号网| 亚洲电影免费观看高清完整版在线| 欧美激情中文字幕乱码免费| 欧美在线xxx| 国产成人福利夜色影视| 日韩欧美精品在线观看| 成人激情电影一区二区| 午夜精品久久久久久久久久久久久| 亚洲欧美日韩天堂一区二区| 九九九久久久久久| 亚洲人成伊人成综合网久久久| 91香蕉嫩草影院入口| 国产偷亚洲偷欧美偷精品| 狠狠色狠狠色综合日日五| 欧美日韩性视频| 国内精品中文字幕| 精品国产户外野外| 精品久久久久久| 日韩精品久久久久久久玫瑰园| 亚洲精品久久久久久久久久久| 少妇高潮久久久久久潘金莲| 欧美电影在线播放| 91精品国产自产在线老师啪| 亚洲精品白浆高清久久久久久| 久久人人爽亚洲精品天堂| 亚洲国产福利在线| 亚洲国产精品一区二区三区| 色先锋资源久久综合5566| 国产视频精品自拍| 欧美激情乱人伦| 久久久噜久噜久久综合| 国产成人精品在线视频| 国产精品视频男人的天堂| 成人97在线观看视频| 国产精品久久国产精品99gif| 精品国产电影一区| 成年无码av片在线| 久久久久国产精品一区| 亚洲美女视频网| 精品美女国产在线| 日韩av电影中文字幕| 久久久久久久成人| 成人a免费视频| 国产亚洲一级高清| 欧美日韩国产色视频| 亚洲大尺度美女在线| 亚洲欧美在线第一页| 欧美黄色三级网站| 国模gogo一区二区大胆私拍| 91久久精品久久国产性色也91| www.亚洲一区| 欧洲亚洲免费视频| 欧美成人精品三级在线观看| 久久中国妇女中文字幕| 欧美精品在线免费播放| 91日本在线观看| 国产成人精品av| 国模视频一区二区三区| 亚洲在线视频观看| 精品小视频在线| 国产精品久久999| 欧美性猛交xxxx乱大交蜜桃| 中文字幕日韩在线观看| 亚洲成在人线av| 国产午夜精品美女视频明星a级| 久久精品国产69国产精品亚洲| 成人妇女淫片aaaa视频| 亚洲国产成人精品女人久久久| 亚洲 日韩 国产第一| 国产色婷婷国产综合在线理论片a| 久久久国产精彩视频美女艺术照福利| 国内精品视频在线| 欧美激情videoshd| 成人有码在线播放| 91黄色8090| 精品久久久久久国产91| 国产脚交av在线一区二区| 日韩在线观看免费| 日韩电影免费在线观看| 久久久久免费视频| 亚洲最大成人免费视频| 国产欧美日韩精品专区| 日韩精品视频在线| 欧美一区二区大胆人体摄影专业网站| 亚洲人成伊人成综合网久久久| 亚洲一区国产精品| 亚洲精品91美女久久久久久久| 国产福利成人在线| 日韩影视在线观看| 欧美网站在线观看| 久久久久久久久亚洲| 欧美在线观看日本一区| 久久精品久久久久| 久久久久一本一区二区青青蜜月| 一区二区三区在线播放欧美| 久久69精品久久久久久国产越南| 成人美女av在线直播| 日韩av在线导航| 国产精品第一第二| 亚洲四色影视在线观看| 国产欧美 在线欧美| 欧美成人免费一级人片100| 亚洲国产成人在线视频| 久久精品91久久香蕉加勒比| 国产精品视频地址| 91系列在线播放| 亚洲精品天天看| 国产日本欧美视频| 精品国内亚洲在观看18黄| 91在线高清视频| 国产成人精品久久亚洲高清不卡| 国产精品18久久久久久首页狼| 成人免费观看网址| 亚洲国产高清高潮精品美女| 欧美成人午夜免费视在线看片| 欧美日韩激情美女| 91av福利视频| 日韩在线中文视频| 亚洲网在线观看| 国产综合香蕉五月婷在线| 国产精品美女主播在线观看纯欲| 国产91精品高潮白浆喷水| 91香蕉国产在线观看| 亚洲国产精品视频在线观看| 亚洲综合在线中文字幕| 日本一区二三区好的精华液| 成人在线视频网站| 久久精品最新地址| 亚洲第一福利网站| 久久视频在线免费观看| 欧美插天视频在线播放| 日韩久久精品成人| 成人免费大片黄在线播放| 久久视频中文字幕| 久久久噜噜噜久久中文字免| 国产精品免费网站| 亚洲国内高清视频| 日韩av三级在线观看| 亚洲精品福利免费在线观看| 亚洲欧美中文另类| 国产亚洲精品成人av久久ww| 欧美精品videossex88| 国模视频一区二区三区| 亚洲精品久久久久久久久久久久| 91精品国产91久久久久久吃药| 91av在线免费观看| 亚洲女人天堂色在线7777| 国产欧美亚洲视频|