策略模式
内容:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使 得算法可独立于使用它的客户而变化。
角色:
- 抽象策略 (Strategy)
- 具体策略 (ConcreteStrategy)
- 上下文(Context)
优点: 定义了一系列可重用的算法和行大 消除了一些条件语句 可以提供相同行为的不同实现
缺点: 客户必须了解不同的策略
策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为,使得可以根据需求动态地切换不同的算法或策略,而不必修改使用算法的代码。策略模式提供了一种将算法独立于客户端代码的方式,使得客户端代码更加灵活和可维护。
策略模式通常包括以下角色:
- 上下文(Context):上下文类包含一个成员变量,用于保存当前所选的策略对象。上下文类还提供了一个方法,用于设置和切换策略,以及执行策略算法。
- 策略接口(Strategy Interface):策略接口定义了一个或多个算法的方法,具体的策略类必须实现这个接口。
- 具体策略(Concrete Strategy):具体策略类实现了策略接口,提供了具体的算法实现。不同的具体策略类可以有不同的算法实现。
from abc import ABCMeta, abstractmethod
class Strategy(metaclass=ABCMeta):
@abstractmethod
def execute(self, data):
pass
class FastStrategy(Strategy):
def execute(self, data):
print("较快的策略%s", data)
class SlowStrategy(Strategy):
def execute(self, data):
print("较慢的策略%s", data)
class Context:
def __init__(self, data, strategy):
self.data = data
self.strategy = strategy
def set_strategy(self, strategy):
self.strategy = strategy
def do_strategy(self):
self.strategy.execute(self.data)
data = "[....]"
s1 = FastStrategy()
s2 = SlowStrategy()
context = Context(data, s1)
context.do_strategy()
context.set_strategy(s2)
context.do_strategy()
# ---------------------------------------------------------------
# 定义策略接口
class PaymentStrategy:
def pay(self, amount):
pass
# 具体策略类1:信用卡支付
class CreditCardPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paid ${amount} with Credit Card")
# 具体策略类2:支付宝支付
class AlipayPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paid ${amount} with Alipay")
# 上下文类
class ShoppingCart:
def __init__(self, payment_strategy):
self.payment_strategy = payment_strategy
def checkout(self, amount):
self.payment_strategy.pay(amount)
# 客户端代码
if __name__ == "__main__":
credit_card_payment = CreditCardPayment()
alipay_payment = AlipayPayment()
cart1 = ShoppingCart(credit_card_payment)
cart1.checkout(100.0) # 输出 "Paid $100.0 with Credit Card"
cart2 = ShoppingCart(alipay_payment)
cart2.checkout(50.0) # 输出 "Paid $50.0 with Alipay"