设计模式汇总:查看
通俗示例
想象一下你正在开发一个在线购物平台,该平台需要支持多种支付方式,比如信用卡支付、支付宝支付和微信支付等。每种支付方式都有不同的支付流程和验证机制。在实现这个功能时,你可以为每种支付方式编写一个统一的接口,然后实现不同的支付类。这样,当用户选择不同的支付方式时,你的平台能够灵活地切换到对应的支付策略,这种设计方式就是策略模式。
通俗解释
策略模式是一种行为型设计模式,它定义了一系列的算法(或行为),把它们一个个封装起来,并且使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。在策略模式中,通常会有一个上下文(Context)负责维护一个策略对象的引用,客户端则通过上下文类来配置所需的策略对象。
策略模式的组成包括以下几部分:
- 策略(Strategy)接口:定义所有支持的算法的公共操作。
- 具体策略(Concrete Strategy)类:实现策略接口,封装了具体的算法。
- 上下文(Context)类:维护一个策略对象的引用,定义了访问策略对象的接口。
策略模式的优点
- 灵活性和可扩展性:能够轻松地添加新算法或修改现有算法,而不会影响到其他部分。
- 封装性:策略类之间是相互独立的,它们封装了各自的算法和行为。
- 易于切换算法:客户端可以轻松地切换算法,因为它们都是通过统一的接口实现的。
Python代码示例
以下是一个策略模式的简单实现:
# 策略接口
class PaymentStrategy:
def pay(self, amount):
pass
# 具体策略类
class CreditCardPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paying {amount} using credit card.")
class AlipayPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paying {amount} using Alipay.")
class WechatPayment(PaymentStrategy):
def pay(self, amount):
print(f"Paying {amount} using Wechat.")
# 上下文类
class PaymentContext:
def __init__(self, strategy):
self._strategy = strategy
def set_strategy(self, strategy):
self._strategy = strategy
def pay(self, amount):
self._strategy.pay(amount)
# 客户端代码
if __name__ == "__main__":
# 创建上下文和策略对象
payment_context = PaymentContext(CreditCardPayment())
# 使用信用卡支付
payment_context.pay(100)
# 更改支付策略为支付宝
payment_context.set_strategy(AlipayPayment())
# 使用支付宝支付
payment_context.pay(200)
# 更改支付策略为微信支付
payment_context.set_strategy(WechatPayment())
# 使用微信支付
payment_context.pay(300)
在这个例子中,PaymentStrategy
是策略接口,CreditCardPayment
、AlipayPayment
和WechatPayment
是具体策略类,它们实现了pay
方法。PaymentContext
是上下文类,它持有一个策略对象的引用,并通过set_strategy
方法可以改变当前策略。客户端代码演示了如何使用策略模式和上下文类来切换不同的支付策略。
总结
策略模式通过定义一系列算法,并将每个算法封装到独立的策略类中,使得算法可以互换,从而让算法的变化独立于客户端代码。这种模式在需要根据不同情况动态选择算法的场景中非常有用。