# 和工厂模式类似,不过这里的结果只是产生不同的类方法 # 设想书店有多种折扣策略,比如“普通会员折扣”、“金牌会员折扣”和“无折扣”。每种折扣策略都是一个具体的策略实现。 from abc import ABC, abstractmethod ######################################################## # 创建折扣策略接口 ######################################################## class DiscountStrategy(ABC): @abstractmethod def calculate_discount(self, book_price): pass ######################################################## # 创建实现了DiscountStrategy接口的具体折扣策略类 ######################################################## class NoDiscountStrategy(DiscountStrategy): def calculate_discount(self, book_price): return book_price # 无折扣,原价返回 class RegularMemberDiscountStrategy(DiscountStrategy): def calculate_discount(self, book_price): return book_price * 0.9 # 普通会员9折 class GoldMemberDiscountStrategy(DiscountStrategy): def calculate_discount(self, book_price): return book_price * 0.8 # 金牌会员8折 ######################################################## # 定义Book类和Bookstore类。Book类包含书籍的信息和价格,Bookstore类则使用折扣策略来计算书籍的折后价 ######################################################## class Book: def __init__(self, title, price): self.title = title self.price = price class Bookstore: def __init__(self, discount_strategy): self.discount_strategy = discount_strategy def set_discount_strategy(self, discount_strategy): self.discount_strategy = discount_strategy def calculate_final_price(self, book): discounted_price = self.discount_strategy.calculate_discount(book.price) return discounted_price if __name__ == "__main__": # 创建书籍对象 book = Book("The Great Gatsby", 30.0) # 创建折扣策略对象 no_discount = NoDiscountStrategy() regular_discount = RegularMemberDiscountStrategy() gold_discount = GoldMemberDiscountStrategy() # 创建书店对象,并设置不同的折扣策略 bookstore = Bookstore(no_discount) print(f"No Discount: The final price of '{book.title}' is {bookstore.calculate_final_price(book)}") bookstore.set_discount_strategy(regular_discount) print(f"Regular Member Discount: The final price of '{book.title}' is {bookstore.calculate_final_price(book)}") bookstore.set_discount_strategy(gold_discount) print(f"Gold Member Discount: The final price of '{book.title}' is {bookstore.calculate_final_price(book)}")