当前位置: 首页 > news >正文

python: Memento Pattern

 

# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: Memento Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/12 23:22 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryMemento.pyimport sys
from threading import settraceclass JewelryMemento(object):"""备忘录类:存储珠宝的状态"""'''#此法也可以def __init__(self, name: str, material: str, price: float, is_inlaid: bool):"""私有属性,仅允许原发器访问:param name::param material::param price::param is_inlaid:"""self.__name = nameself.__material = materialself.__price = priceself.__is_inlaid = is_inlaid'''def __init__(self):"""私有属性,仅允许原发器访问:param name::param material::param price::param is_inlaid:"""self.__name = Noneself.__material = Noneself.__price = Noneself.__is_inlaid = None# 提供只读的访问方法(仅原发器使用)@propertydef name(self)->str:""":return:"""return self.__name@name.setterdef name(self,name:str):""":param name::return:"""self.__name = name@propertydef material(self)->str:""":return:"""return self.__material@material.setterdef material(self,material:str):""":param material::return:"""self.__material = material@propertydef price(self)->float:""":return:"""return self.__price@price.setterdef price(self,price:float):""":param price::return:"""self.__price = price@propertydef is_inlaid(self)->bool:""":return:"""return self.__is_inlaid@is_inlaid.setterdef is_inlaid(self,is_inlaid):""":param is_inlaid::return:"""self.__is_inlaid = is_inlaid# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: Memento Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/12 23:30 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryCaretaker.pyfrom MementoPattern.JewelryMemento import JewelryMementoclass JewelryCaretaker(object):"""负责人类:管理珠宝备忘录的存储和获取"""def __init__(self):# 用列表存储多个备忘录(支持恢复到多个历史状态)self.__mementos = []def save_memento(self, memento: JewelryMemento):"""保存备忘录:param memento::return:"""self.__mementos.append(memento)print(f"\n已保存第 {len(self.__mementos)} 个版本的珠宝状态")def get_memento(self, index: int) -> JewelryMemento:"""获取指定索引的备忘录:param index::return:"""if 0 <= index < len(self.__mementos):return self.__mementos[index]raise IndexError("备忘录索引超出范围")# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: Memento Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/12 23:25 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : Jewelry.pyfrom MementoPattern.JewelryMemento import JewelryMementoclass Jewelry(object):"""原发器类:珠宝实体对象"""'''#此法也可以def __init__(self, name: str, material: str, price: float, is_inlaid: bool):""":param name: 珠宝名称:param material: 材质(黄金、钻石、铂金等):param price: 价格:param is_inlaid: 是否镶嵌宝石"""self.name = name"""珠宝名称"""self.material = material"""材质(黄金、钻石、铂金等)"""self.price = price"""价格"""self.is_inlaid = is_inlaid"""是否镶嵌宝石"""'''def __init__(self, jwelry:JewelryMemento):""":param jwelry:"""self.name = jwelry.name"""珠宝名称"""self.material = jwelry.material"""材质(黄金、钻石、铂金等)"""self.price = jwelry.price"""价格"""self.is_inlaid = jwelry.is_inlaidself.object=jwelry"""是否镶嵌宝石"""def create_memento(self) -> JewelryMemento:"""创建备忘录:保存当前珠宝的状态:return:"""obj = JewelryMemento()obj.name = self.nameobj.material = self.materialobj.price = self.priceobj.is_inlaid = self.is_inlaidreturn obj  # 相应上法也可以用: JewelryMemento(self.name, self.material, self.price, self.is_inlaid)def restore_from_memento(self, memento: JewelryMemento):"""从备忘录恢复珠宝状态:param memento::return:"""self.name = memento.nameself.material = memento.materialself.price = memento.priceself.is_inlaid = memento.is_inlaiddef show_status(self):"""显示当前珠宝状态:return:"""formatted_number =  self.pricestatus= "珠宝信息: \n 名称:{0} \n 材质:{1} \n 价格:{2} 元 \n 是否镶嵌宝石:{3}".format(self.name,self.material,formatted_number,'是' if self.is_inlaid else '否')  #  '是' if self.is_inlaid else '否'print(status)

  

调用:

# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: Memento Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/12 23:22
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : main.pyfrom MementoPattern.JewelryMemento import JewelryMemento
from MementoPattern.Jewelry import Jewelry
from MementoPattern.JewelryCaretaker import JewelryCaretaker# Press the green button in the gutter to run the script.
if __name__ == '__main__':# 1. 创建初始珠宝对象jewelry = JewelryMemento()jewelry.name="钻石戒指"jewelry.material = "铂金",jewelry.price = 19999.99,jewelry.is_inlaid = Truediamond_ring=Jewelry(jewelry)print("=== 初始状态 ===")diamond_ring.show_status()'''diamond_ring = Jewelry(name="钻石戒指",material="铂金",price=19999.99,is_inlaid=True)print("=== 初始状态 ===")diamond_ring.show_status()'''# 2. 创建负责人并保存初始状态caretaker = JewelryCaretaker()caretaker.save_memento(diamond_ring.create_memento())# 3. 修改珠宝状态(调价+更换材质)diamond_ring.price = 22999.99diamond_ring.material = "18K金"print("\n=== 修改后状态 ===")diamond_ring.show_status()caretaker.save_memento(diamond_ring.create_memento())# 4. 再次修改状态(取消镶嵌)diamond_ring.is_inlaid = Falsediamond_ring.name = "简约戒指"print("\n=== 再次修改后状态 ===")diamond_ring.show_status()# 5. 恢复到第一个版本(初始状态)print("\n=== 恢复到初始状态 ===")diamond_ring.restore_from_memento(caretaker.get_memento(0))diamond_ring.show_status()# 6. 恢复到第二个版本(第一次修改后的状态)print("\n=== 恢复到第一次修改后的状态 ===")diamond_ring.restore_from_memento(caretaker.get_memento(1))diamond_ring.show_status()

  

输出:

image

 

http://www.jsqmd.com/news/380397/

相关文章:

  • Nginx解决Access-Control-Allow-Origin跨域问题完全完整教程:从入门到实战部署
  • 2026年石材装饰供货商综合评估与采购决策指南 - 2026年企业推荐榜
  • 长沙GEO运营公司哪家强?2026年2月最新口碑推荐 - 2026年企业推荐榜
  • MVC分层
  • 2026年初夷陵区种子店铺测评:五家可靠服务商深度对比 - 2026年企业推荐榜
  • 2026年武汉光伏设计服务市场趋势与优选指南 - 2026年企业推荐榜
  • 2026年武汉光伏储能直销公司专业选择指南 - 2026年企业推荐榜
  • 2026武汉石材装饰公司选购权威指南:评测、对比与选型 - 2026年企业推荐榜
  • 爬虫伦理与合法性:如何避免法律风险
  • 高项之项目成本管理
  • 高项之项目质量管理
  • ‌伦理治理工具:规则引擎在AI测试偏见的审计仪表盘‌
  • 2026年四川硬芯线加工厂综合评测与选型指南 - 2026年企业推荐榜
  • 89_Spring AI 干货笔记之 GemFire 向量存储
  • 2026年国土空间规划调整技术服务专业机构深度评测 - 2026年企业推荐榜
  • 2026年四川电线电缆厂家实力盘点与选型指南 - 2026年企业推荐榜
  • D.二分查找-二分答案-最小化最大值——2064. 分配给商店的最多商品的最小值
  • 西安买房服务如何选?2026年值得关注的五家实力公司 - 2026年企业推荐榜
  • 2026循环水药剂厂家甄选指南:聚焦口碑与技术硬实力 - 2026年企业推荐榜
  • 2026年宜兴地区硝化菌剂供应商可靠性综合测评与选择指南 - 2026年企业推荐榜
  • 一文搞懂掌控消息全链路(2)——RabbitMQ/Spring-AMQP高级特性之消息可靠性和重试机制:核心原理+实战案例
  • 固镇小户型装修指南:2026年2月五大品牌实力横评 - 2026年企业推荐榜
  • 2026年编制考试培训机构口碑盘点与深度解析 - 2026年企业推荐榜
  • 日志级别是摆设吗?
  • 2026年Q1全液压钻机可靠源头厂家五强榜单及选型指南 - 2026年企业推荐榜
  • 2026纹身贴高产能厂商综合实力TOP5盘点 - 2026年企业推荐榜
  • 5个维度解决3D打印文件处理难题:Blender 3MF插件实战指南
  • 如何用League Director实现高效专业级《英雄联盟》高光视频制作
  • 3步告别C盘爆红:Windows Cleaner终极清理指南
  • Smart AutoClicker 3.3.0焕新发布:智能图像识别自动化工具的效能飞跃