策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。
策略模式的关键思想是将行为从环境类中分离出来,使得它们能够独立变化。客户端可以在运行时选择不同的策略,而无需修改客户端的代码。
class Strategy:
def execute(self, data):
pass
class ConcreteStrategyA(Strategy):
def execute(self, data):
print("Executing strategy A")
class ConcreteStrategyB(Strategy):
def execute(self, data):
print("Executing strategy B")
class Context:
def __init__(self, strategy: Strategy):
self._strategy = strategy
def set_strategy(self, strategy: Strategy):
self._strategy = strategy
def execute_strategy(self, data):
self._strategy.execute(data)
# 使用策略模式
context = Context(ConcreteStrategyA())
context.execute_strategy(data)
context.set_strategy(ConcreteStrategyB())
context.execute_strategy(data)
需要在多种算法中进行选择时:
避免使用条件语句(if-else 或 switch-case):
行为在运行时需要改变:
假设你有一个数据处理系统,需要根据不同的数据量选择不同的排序算法,例如在数据量小的时候使用插入排序,在数据量大的时候使用快速排序。
class SortStrategy:
def sort(self, data):
pass
class InsertionSort(SortStrategy):
def sort(self, data):
print("Using Insertion Sort")
# 插入排序算法实现
return sorted(data)
class QuickSort(SortStrategy):
def sort(self, data):
print("Using Quick Sort")
# 快速排序算法实现
return sorted(data)
class SortContext:
def __init__(self, strategy: SortStrategy):
self._strategy = strategy
def set_strategy(self, strategy: SortStrategy):
self._strategy = strategy
def sort_data(self, data):
return self._strategy.sort(data)
data = [5, 3, 8, 6, 2]
context = SortContext(InsertionSort())
sorted_data = context.sort_data(data)
context.set_strategy(QuickSort())
sorted_data = context.sort_data(data)
在文件压缩工具中,可以选择不同的压缩算法,比如 ZIP、RAR、TAR 等。使用策略模式,可以让用户根据需要选择不同的压缩算法。
class CompressionStrategy:
def compress(self, files):
pass
class ZipCompression(CompressionStrategy):
def compress(self, files):
print("Compressing using ZIP")
# ZIP压缩算法实现
class RarCompression(CompressionStrategy):
def compress(self, files):
print("Compressing using RAR")
# RAR压缩算法实现
class CompressionContext:
def __init__(self, strategy: CompressionStrategy):
self._strategy = strategy
def set_strategy(self, strategy: CompressionStrategy):
self._strategy = strategy
def compress_files(self, files):
self._strategy.compress(files)
files = ["file1.txt", "file2.txt"]
context = CompressionContext(ZipCompression())
context.compress_files(files)
context.set_strategy(RarCompression())
context.compress_files(files)
在电子商务系统中,用户可以选择不同的支付方式,比如信用卡支付、PayPal支付、比特币支付等。使用策略模式,可以灵活地添加和切换不同的支付方式。
class PaymentStrategy:
def pay(self, amount):
pass
class CreditCardPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paying {amount} using Credit Card")
class PayPalPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paying {amount} using PayPal")
class BitcoinPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paying {amount} using Bitcoin")
class PaymentContext:
def __init__(self, strategy: PaymentStrategy):
self._strategy = strategy
def set_strategy(self, strategy: PaymentStrategy):
self._strategy = strategy
def pay_amount(self, amount):
self._strategy.pay(amount)
context = PaymentContext(CreditCardPayment())
context.pay_amount(100)
context.set_strategy(PayPalPayment())
context.pay_amount(200)
context.set_strategy(BitcoinPayment())
context.pay_amount(300)
通过使用策略模式,这些示例展示了如何在运行时灵活地选择和切换不同的算法或行为,从而提高代码的可维护性和可扩展性。