策略模式Strategy Pattern是一种行为型设计模式。它的核心思想是定义一系列算法把它们一个个封装起来并且使它们可以相互替换。简单来说就是“把变化的逻辑提取出来做成独立的类让调用者可以根据需要动态地选择使用哪一个逻辑”。1. 核心概念策略模式包含三个主要角色策略接口Strategy Interface定义所有支持算法的公共接口。具体策略Concrete Strategies实现策略接口的具体算法类。每个类封装了一种特定的算法或行为。上下文Context持有一个策略对象的引用并在运行时通过该引用调用具体的策略方法。上下文不关心具体使用的是哪种策略它只负责执行。2. 为什么要用策略模式解决什么问题假设你要开发一个电商系统的支付功能最初可能长这样classPaymentService:defpay(self,type,amount):iftypeALIPAY:print(使用支付宝支付)# 支付宝复杂逻辑...eliftypeWECHAT:print(使用微信支付)# 微信复杂逻辑...eliftypeCREDIT_CARD:print(使用信用卡支付)# 信用卡复杂逻辑...else:raiseException(不支持的支付方式)这种写法的问题违反开闭原则OCP每增加一种新的支付方式如银联、PayPal你都必须修改PaymentService类的代码增加新的elif。代码臃肿随着支付方式增多if-else或switch-case会变得极其庞大且难以维护。难以测试很难单独测试某一种支付逻辑因为它们耦合在同一个类中。使用策略模式后我们将每种支付方式封装成独立的类。增加新支付方式时只需新建一个类无需修改原有代码。3. 代码示例Python第一步定义策略接口fromabcimportABC,abstractmethod# 策略接口classPaymentStrategy(ABC):abstractmethoddefpay(self,amount:float):pass第二步实现具体策略# 具体策略支付宝classAlipayStrategy(PaymentStrategy):defpay(self,amount:float):print(f正在使用【支付宝】支付:{amount}元)# 这里可以放入支付宝特有的复杂逻辑# 具体策略微信classWechatPayStrategy(PaymentStrategy):defpay(self,amount:float):print(f正在使用【微信支付】支付:{amount}元)# 这里可以放入微信特有的复杂逻辑# 具体策略信用卡classCreditCardStrategy(PaymentStrategy):defpay(self,amount:float):print(f正在使用【信用卡】支付:{amount}元)# 这里可以放入信用卡特有的复杂逻辑第三步定义上下文ContextclassPaymentContext:def__init__(self,strategy:PaymentStrategy):# 持有策略对象self._strategystrategydefset_strategy(self,strategy:PaymentStrategy):# 允许在运行时动态切换策略self._strategystrategydefexecute_payment(self,amount:float):# 委托给策略对象执行self._strategy.pay(amount)第四步客户端调用if__name____main__:# 1. 创建上下文初始选择支付宝contextPaymentContext(AlipayStrategy())context.execute_payment(100.0)# 输出: 正在使用【支付宝】支付: 100.0 元# 2. 动态切换策略为微信context.set_strategy(WechatPayStrategy())context.execute_payment(200.0)# 输出: 正在使用【微信支付】支付: 200.0 元# 3. 动态切换策略为信用卡context.set_strategy(CreditCardStrategy())context.execute_payment(300.0)# 输出: 正在使用【信用卡】支付: 300.0 元4. 策略模式的优点符合开闭原则增加新的策略算法只需要新增一个类不需要修改现有的上下文或旧策略代码。消除条件语句避免了复杂的if-else或switch-case嵌套代码更清晰。算法可互换客户端可以在运行时根据需要切换算法。单一职责每个策略类只负责一种算法的实现逻辑内聚易于单元测试。5. 策略模式的缺点类数量增加每种策略都需要一个单独的类如果策略很多会导致系统中类的数量急剧增加。客户端必须了解所有策略客户端调用者需要知道有哪些策略可用并决定使用哪一个。这有时会将选择逻辑的压力转移给客户端。解决方案可以结合工厂模式或枚举来简化策略的选择过程。6. 常见应用场景支付方式支付宝、微信、信用卡、银联等。排序算法快速排序、冒泡排序、归并排序根据数据量大小动态选择。日志输出控制台输出、文件输出、数据库输出。折扣计算普通会员、VIP会员、超级VIP会员的不同折扣率。压缩算法ZIP、RAR、7Z 等不同压缩格式的处理。7. 与其他模式的区别** vs 状态模式State Pattern**结构非常相似。策略模式客户端主动选择策略策略之间通常无关联目的是替换算法。状态模式状态的转换通常由上下文内部触发基于当前状态状态之间可能有转换逻辑目的是管理对象的生命周期行为。** vs 模板方法模式Template Method**模板方法通过继承来实现算法骨架在父类细节在子类。策略模式通过组合来实现算法完全封装在独立类中更灵活符合“组合优于继承”原则。总结当你发现代码中有大量的if-else或switch用于选择不同的业务逻辑且这些逻辑未来可能会频繁增减时策略模式是最佳的重构选择。它将“做什么”Context和“怎么做”Strategy解耦使系统更加灵活和可扩展。