|
|
'''
|
|
|
备忘录模式(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 对象中恢复状态。
|
|
|
|
|
|
客户端代码创建了一个书籍对象,对其进行了阅读和高亮操作,然后保存了当前状态。之后改变了书籍的状态,并使用之前保存的状态恢复了书籍对象。
|
|
|
|
|
|
这样,用户就可以在需要的时候回到之前的阅读状态,无论是在同一个会话中还是在不同的会话中。这种模式在需要提供“撤销”或“恢复”功能的应用中非常有用。
|
|
|
''' |