You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.8 KiB

9 months ago
'''
备忘录模式Memento Pattern
在不破坏封装的前提下捕获一个对象的内部状态并在该对象之外保存这个状态
备忘录模式Memento Pattern可以用来保存和恢复书籍对象的内部状态
例如用户可能想要保存他们当前阅读的书籍状态比如阅读进度高亮部分等以便之后可以恢复到这个状态
'''
# 书籍类,包含阅读状态
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
self.page = 1 # 初始页码
self.highlights = [] # 高亮部分
def read(self, page):
self.page = page
print(f"Reading page {self.page} of '{self.title}' by {self.author}")
def highlight(self, text):
self.highlights.append(text)
print(f"Highlighted text: {text}")
def get_current_state(self):
return BookMemento(self.page, self.highlights[:])
def restore_state(self, memento):
self.page = memento.get_page()
self.highlights = memento.get_highlights()
# 备忘录类,用于保存书籍状态
class BookMemento:
def __init__(self, page, highlights):
self.page = page
self.highlights = highlights
def get_page(self):
return self.page
def get_highlights(self):
return self.highlights
# 客户端代码
if __name__ == "__main__":
# 创建书籍对象
book = Book("The Hobbit", "J.R.R. Tolkien")
# 阅读和高亮文本
book.read(50)
book.highlight("Gollum's precious!")
# 保存当前状态
memento = book.get_current_state()
# 改变状态
book.read(100)
book.highlight("The dragon is coming!")
# 恢复状态
print("Restoring state...")
book.restore_state(memento)
print(f"Current page is {book.page}")
print("Highlighted texts:")
for highlight in book.highlights:
print(highlight)
'''
在这个示例中Book 类代表了一本书包含了页码和高亮部分等状态信息BookMemento 类用于保存书籍的某一时刻的状态Book 类提供了 get_current_state 方法来创建并返回一个包含当前阅读状态的 BookMemento 对象同样地Book 类也提供了 restore_state 方法来从 BookMemento 对象中恢复状态
客户端代码创建了一个书籍对象对其进行了阅读和高亮操作然后保存了当前状态之后改变了书籍的状态并使用之前保存的状态恢复了书籍对象
这样用户就可以在需要的时候回到之前的阅读状态无论是在同一个会话中还是在不同的会话中这种模式在需要提供撤销恢复功能的应用中非常有用
'''