|
|
'''
|
|
|
代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。
|
|
|
在书城的业务背景中,代理模式(Proxy Pattern)可以应用于多种场景,例如实现延迟加载、访问控制、远程代理等。
|
|
|
下面示例展示如何使用代理模式来控制对书城中书籍对象的访问。
|
|
|
假设我们有一个Book类,代表书城中的书籍,和一个BookProxy类,作为Book的代理类,来控制对书籍的访问。
|
|
|
'''
|
|
|
|
|
|
# 书籍类
|
|
|
class Book:
|
|
|
def __init__(self, title, author, price):
|
|
|
self.title = title
|
|
|
self.author = author
|
|
|
self.price = price
|
|
|
self.is_loaded = False # 假设书籍内容初始时是未加载的
|
|
|
|
|
|
def load_content(self):
|
|
|
# 模拟加载书籍内容的过程,这里仅打印一条消息
|
|
|
print(f"Loading content for book '{self.title}' by {self.author}...")
|
|
|
self.is_loaded = True
|
|
|
|
|
|
def display(self):
|
|
|
if not self.is_loaded:
|
|
|
self.load_content()
|
|
|
print(f"Book Title: {self.title}")
|
|
|
print(f"Author: {self.author}")
|
|
|
print(f"Price: {self.price}")
|
|
|
print("Content is loaded and displayed.")
|
|
|
|
|
|
# 书籍代理类
|
|
|
class BookProxy:
|
|
|
def __init__(self, book):
|
|
|
self.book = book
|
|
|
|
|
|
def display(self):
|
|
|
# 在显示书籍信息之前,代理可以控制一些额外的操作
|
|
|
# 比如检查用户权限、记录访问日志等
|
|
|
# 这里我们模拟一个简单的访问控制
|
|
|
print("Checking access permissions...")
|
|
|
# 假设权限检查通过,调用实际对象的display方法
|
|
|
self.book.display()
|
|
|
|
|
|
# 客户端代码
|
|
|
if __name__ == "__main__":
|
|
|
# 创建一个书籍对象(假设内容尚未加载)
|
|
|
book = Book("The Great Gatsby", "F. Scott Fitzgerald", 29.99)
|
|
|
# 创建一个书籍代理对象
|
|
|
book_proxy = BookProxy(book)
|
|
|
# 通过代理来访问书籍信息
|
|
|
book_proxy.display()
|
|
|
|
|
|
|
|
|
'''
|
|
|
在这个示例中,Book类有一个load_content方法来模拟加载书籍内容的过程,以及一个display方法来显示书籍的信息。
|
|
|
在实际应用中,load_content可能会执行更加复杂的操作,如从数据库或远程服务器加载数据。
|
|
|
BookProxy类作为代理,包装了对Book对象的访问。
|
|
|
在这个简单的例子中,它在调用display方法之前执行了一个模拟的权限检查。
|
|
|
在实际应用中,代理类可以执行各种操作,如缓存、懒加载、权限验证等。
|
|
|
客户端代码通过创建BookProxy对象来间接访问Book对象,而不是直接访问。
|
|
|
这种方式提供了一种灵活的控制机制,使得可以在不修改原始类的情况下增加额外的功能或控制逻辑。
|
|
|
''' |