'''
备忘录模式（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 对象中恢复状态。

客户端代码创建了一个书籍对象，对其进行了阅读和高亮操作，然后保存了当前状态。之后改变了书籍的状态，并使用之前保存的状态恢复了书籍对象。

这样，用户就可以在需要的时候回到之前的阅读状态，无论是在同一个会话中还是在不同的会话中。这种模式在需要提供“撤销”或“恢复”功能的应用中非常有用。
'''        