python
# 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.py
import sys
from threading import settrace
class 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 = name
self.__material = material
self.__price = price
self.__is_inlaid = is_inlaid
'''
def __init__(self):
"""
私有属性,仅允许原发器访问
:param name:
:param material:
:param price:
:param is_inlaid:
"""
self.__name = None
self.__material = None
self.__price = None
self.__is_inlaid = None
# 提供只读的访问方法(仅原发器使用)
@property
def name(self)->str:
"""
:return:
"""
return self.__name
@name.setter
def name(self,name:str):
"""
:param name:
:return:
"""
self.__name = name
@property
def material(self)->str:
"""
:return:
"""
return self.__material
@material.setter
def material(self,material:str):
"""
:param material:
:return:
"""
self.__material = material
@property
def price(self)->float:
"""
:return:
"""
return self.__price
@price.setter
def price(self,price:float):
"""
:param price:
:return:
"""
self.__price = price
@property
def is_inlaid(self)->bool:
"""
:return:
"""
return self.__is_inlaid
@is_inlaid.setter
def 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.py
from MementoPattern.JewelryMemento import JewelryMemento
class 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.py
from MementoPattern.JewelryMemento import JewelryMemento
class 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_inlaid
self.object=jwelry
"""
是否镶嵌宝石
"""
def create_memento(self) -> JewelryMemento:
"""
创建备忘录:保存当前珠宝的状态
:return:
"""
obj = JewelryMemento()
obj.name = self.name
obj.material = self.material
obj.price = self.price
obj.is_inlaid = self.is_inlaid
return obj # 相应上法也可以用: JewelryMemento(self.name, self.material, self.price, self.is_inlaid)
def restore_from_memento(self, memento: JewelryMemento):
"""
从备忘录恢复珠宝状态
:param memento:
:return:
"""
self.name = memento.name
self.material = memento.material
self.price = memento.price
self.is_inlaid = memento.is_inlaid
def show_status(self):
"""
显示当前珠宝状态
:return:
"""
formatted_number = self.price
status= "珠宝信息: \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)
调用:
python
# 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.py
from 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 = True
diamond_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.99
diamond_ring.material = "18K金"
print("\n=== 修改后状态 ===")
diamond_ring.show_status()
caretaker.save_memento(diamond_ring.create_memento())
# 4. 再次修改状态(取消镶嵌)
diamond_ring.is_inlaid = False
diamond_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()
输出:
