python: Memento Pattern

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()

输出:

相关推荐
学无止境_永不停歇1 小时前
十、C++多态
开发语言·c++
寻星探路2 小时前
【JVM 终极通关指南】万字长文从底层到实战全维度深度拆解 Java 虚拟机
java·开发语言·jvm·人工智能·python·算法·ai
lbb 小魔仙2 小时前
【Java】Java 实战项目:手把手教你写一个电商订单系统
android·java·python
Aric_Jones2 小时前
JavaScript 从入门到精通:完整语法指南
开发语言·javascript·ecmascript
岱宗夫up2 小时前
FastAPI入门(上篇):快速构建高性能Python Web API
开发语言·前端·python·fastapi
Dxy12393102162 小时前
中文乱码恢复方案
开发语言·python
浅念-2 小时前
C/C++内存管理
c语言·开发语言·c++·经验分享·笔记·学习
回敲代码的猴子2 小时前
2月8日上机
开发语言·c++·算法
rongyili883 小时前
Dify 外部知识库集成 Milvus 实战指南
开发语言·python·milvus