设计模式-策略模式
已于 2025年02月25日 15:40 修改
访问次数:12
策略模式(Strategy Pattern)
策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的实现。策略模式将每一个算法封装成一个独立的类,并让它们可以互换。通过策略模式,客户端可以在不同的策略之间进行切换,而无需修改算法本身。
策略模式的结构
- Context(上下文):持有一个
Strategy对象,并且可以在运行时切换策略。上下文通过Strategy接口来与不同的具体策略进行交互。 - Strategy(策略接口):定义了一个公共接口,所有具体策略类都需要实现这个接口,从而确保上下文可以在不依赖于具体实现的情况下,调用
Strategy提供的功能。 - ConcreteStrategy(具体策略):实现
Strategy接口的具体类,每个具体策略都封装了一个特定的算法。
策略模式的优点:
- 算法的独立性:不同的算法被封装在不同的策略类中,算法的变化不会影响到使用这些算法的客户。
- 易于扩展:新的策略可以被轻松地添加,而无需修改现有的代码(符合开放/封闭原则)。
- 避免条件判断语句:通过多态替代了复杂的条件判断语句,使代码更简洁。
策略模式的缺点:
- 类的数量增多:每增加一种新的策略,就需要创建一个新的策略类,导致类的数量增多。
- 客户端必须了解不同的策略:客户端需要知道不同的策略,并且能够选择合适的策略。
策略模式的UML图
+---------------------+
| Context |
+---------------------+
| - strategy: Strategy |
+---------------------+
| + setStrategy(s: Strategy) |
| + executeStrategy() |
+---------------------+
^
|
|
+--------------------------+
| Strategy (Interface) |
+--------------------------+
| + algorithm() |
+--------------------------+
^ ^ ^
| | |
+------------------+ +------------------+ +------------------+
| ConcreteStrategyA | | ConcreteStrategyB | | ConcreteStrategyC |
+------------------+ +------------------+ +------------------+
| + algorithm() | | + algorithm() | | + algorithm() |
+------------------+ +------------------+ +------------------+
策略模式的Python实现
假设我们有一个简单的支付系统,可以选择不同的支付策略,比如信用卡支付、微信支付和支付宝支付。我们可以通过策略模式来实现这一功能:
from abc import ABC, abstractmethod
# 策略接口
class PaymentStrategy(ABC):
@abstractmethod
def pay(self, amount: float):
pass
# 具体策略A:信用卡支付
class CreditCardPayment(PaymentStrategy):
def pay(self, amount: float):
return f"Paid {amount} using Credit Card."
# 具体策略B:微信支付
class WeChatPayment(PaymentStrategy):
def pay(self, amount: float):
return f"Paid {amount} using WeChat."
# 具体策略C:支付宝支付
class AlipayPayment(PaymentStrategy):
def pay(self, amount: float):
return f"Paid {amount} using Alipay."
# 上下文
class PaymentContext:
def __init__(self, strategy: PaymentStrategy):
self._strategy = strategy
# 可以在运行时设置不同的策略
def set_strategy(self, strategy: PaymentStrategy):
self._strategy = strategy
def execute_payment(self, amount: float):
return self._strategy.pay(amount)
# 客户端代码
if __name__ == "__main__":
# 创建上下文并选择支付策略
context = PaymentContext(CreditCardPayment())
# 进行支付
print(context.execute_payment(100.0)) # 输出:Paid 100.0 using Credit Card.
# 更改支付策略为微信支付
context.set_strategy(WeChatPayment())
print(context.execute_payment(200.0)) # 输出:Paid 200.0 using WeChat.
# 更改支付策略为支付宝支付
context.set_strategy(AlipayPayment())
print(context.execute_payment(300.0)) # 输出:Paid 300.0 using Alipay.
解释:
- PaymentStrategy(支付策略接口):定义了一个统一的
pay()方法,所有具体的支付方式都需要实现这个方法。 - CreditCardPayment、WeChatPayment、AlipayPayment(具体支付策略类):每个类实现了
PaymentStrategy接口,封装了各自的支付方式逻辑。 - PaymentContext(上下文):上下文持有一个
PaymentStrategy对象,可以在运行时动态改变策略,执行相应的支付操作。
运行结果:
Paid 100.0 using Credit Card.
Paid 200.0 using WeChat.
Paid 300.0 using Alipay.
总结:
- 策略模式是通过将算法封装成独立的策略类,使得客户端可以在运行时选择具体的策略,并且能够在不修改客户端代码的情况下扩展新的策略。
- 这种模式的应用非常广泛,尤其是在需要频繁改变行为或算法的场景中,策略模式使得代码更加清晰、可维护和易于扩展。
- 策略模式解决了在不同场景下使用不同算法的需求,减少了条件判断,使得代码更加符合开放/封闭原则。
评论(0)