🧠 策略模式(Strategy Pattern)
策略模式是一种行为型设计模式,它允许定义一系列的算法或行为,然后将每个算法封装到一个类中,使得它们可以互换。策略模式让算法独立于使用它的客户端进行变化,从而使得算法的变更不影响到使用它的客户端。
🎯 为什么需要策略模式?
- 避免大量的条件语句(if-else):如果对象需要根据不同的策略(或行为)执行不同的操作,使用策略模式可以避免在代码中频繁出现
if-else
或switch
语句。 - 高内聚低耦合:策略模式将每个策略封装到独立的类中,增强了代码的高内聚性,并且减少了类与类之间的耦合。
- 动态切换策略:策略模式使得策略可以在运行时动态地切换,提供了灵活性。
- 开放封闭原则:策略模式符合开放封闭原则,可以通过新增策略类来扩展系统的功能,而不需要修改已有代码。
✅ 优缺点分析
✅ 优点 | ❌ 缺点 |
---|---|
可以通过改变策略动态改变行为 | 增加了类的数量 |
避免了多重条件语句(如 if-else) | 客户端必须了解所有的策略类 |
提高了系统的可维护性 | 如果策略过多,可能会使系统变得复杂 |
每个策略类相对独立,方便扩展和替换 | 需要明确的选择策略的时机 |
🧩 Python 示例:支付系统
假设我们有一个支付系统,支持不同的支付方式,比如 信用卡支付、支付宝支付 和 微信支付。每种支付方式有不同的支付策略。
🎯 1️⃣ 策略接口(Strategy)
from abc import ABC, abstractmethod
class PaymentStrategy(ABC):
@abstractmethod
def pay(self, amount: float):
pass
PaymentStrategy
是一个支付策略的接口,所有具体的支付方式(如信用卡支付、支付宝支付等)都需要实现pay()
方法。
🎯 2️⃣ 具体策略类(Concrete Strategies)
class CreditCardPayment(PaymentStrategy):
def pay(self, amount: float):
print(f"Paid {amount} using Credit Card")
class AlipayPayment(PaymentStrategy):
def pay(self, amount: float):
print(f"Paid {amount} using Alipay")
class WeChatPayment(PaymentStrategy):
def pay(self, amount: float):
print(f"Paid {amount} using WeChat Pay")
CreditCardPayment
:实现了通过信用卡支付的方法。AlipayPayment
:实现了通过支付宝支付的方法。WeChatPayment
:实现了通过微信支付的方法。
🎯 3️⃣ 上下文类(Context)
class PaymentContext:
def __init__(self, strategy: PaymentStrategy):
self._strategy = strategy # 初始化时传入策略对象
def set_strategy(self, strategy: PaymentStrategy):
self._strategy = strategy # 允许动态切换策略
def pay(self, amount: float):
self._strategy.pay(amount) # 使用当前策略进行支付
PaymentContext
类负责使用具体的策略进行支付。它持有一个策略对象,并通过pay()
方法委托给当前策略对象执行支付操作。set_strategy()
方法允许在运行时动态切换支付方式。
🎯 4️⃣ 客户端代码(使用策略进行支付)
# 创建不同的支付策略
credit_card_payment = CreditCardPayment()
alipay_payment = AlipayPayment()
wechat_payment = WeChatPayment()
# 创建支付上下文并使用策略进行支付
payment_context = PaymentContext(credit_card_payment)
payment_context.pay(100) # 通过信用卡支付
# 切换策略为支付宝支付
payment_context.set_strategy(alipay_payment)
payment_context.pay(200) # 通过支付宝支付
# 切换策略为微信支付
payment_context.set_strategy(wechat_payment)
payment_context.pay(300) # 通过微信支付
✅ 输出结果
Paid 100 using Credit Card
Paid 200 using Alipay
Paid 300 using WeChat Pay
🧭 类图(Mermaid)
🧭 流程图(Mermaid)
🧠 应用场景总结
场景 | 示例 |
---|---|
支付方式切换 | 电子商务网站支持不同的支付方式,如信用卡支付、支付宝支付等 |
排序策略 | 系统中需要实现多种排序算法,可以使用策略模式进行切换 |
游戏AI | 游戏中不同角色有不同的战斗策略,可以使用策略模式进行管理 |
✅ 总结口诀
策略模式:
✅ 将每种行为或算法封装成独立的策略类,客户端通过选择不同的策略来改变行为。
✅ 适用于需要在运行时动态改变算法或行为的场景。
如果你有任何问题或需要进一步的解释,随时告诉我!