【Python设计模式04】策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化不会影响使用算法的客户端,使得算法可以独立于客户端的变化而变化。

策略模式的结构

策略模式主要包含以下角色:

  1. 策略接口(Strategy):定义算法的接口。
  2. 具体策略类(Concrete Strategy):实现策略接口的具体算法。
  3. 上下文类(Context):使用策略对象的上下文,维护对策略对象的引用,并在需要时调用策略对象的方法。

示例

假设我们要设计一个计算不同类型折扣的系统。我们可以使用策略模式来实现这一功能。

定义策略接口
python 复制代码
from abc import ABC, abstractmethod

class DiscountStrategy(ABC):
    @abstractmethod
    def apply_discount(self, price: float) -> float:
        pass
实现具体策略类
python 复制代码
class NoDiscount(DiscountStrategy):
    def apply_discount(self, price: float) -> float:
        return price

class PercentageDiscount(DiscountStrategy):
    def __init__(self, percentage: float):
        self.percentage = percentage

    def apply_discount(self, price: float) -> float:
        return price * (1 - self.percentage / 100)

class FixedAmountDiscount(DiscountStrategy):
    def __init__(self, amount: float):
        self.amount = amount

    def apply_discount(self, price: float) -> float:
        return max(0, price - self.amount)
定义上下文类
python 复制代码
class PriceCalculator:
    def __init__(self, strategy: DiscountStrategy):
        self.strategy = strategy

    def calculate_price(self, price: float) -> float:
        return self.strategy.apply_discount(price)
使用策略模式
python 复制代码
def main():
    original_price = 100.0

    no_discount = NoDiscount()
    ten_percent_discount = PercentageDiscount(10)
    five_dollar_discount = FixedAmountDiscount(5)

    calculator = PriceCalculator(no_discount)
    print(f"Original price: ${original_price}, No discount: ${calculator.calculate_price(original_price)}")

    calculator.strategy = ten_percent_discount
    print(f"Original price: ${original_price}, 10% discount: ${calculator.calculate_price(original_price)}")

    calculator.strategy = five_dollar_discount
    print(f"Original price: ${original_price}, $5 discount: ${calculator.calculate_price(original_price)}")

if __name__ == "__main__":
    main()

策略模式的优缺点

优点
  1. 开闭原则:可以在不修改上下文类的情况下引入新的策略,实现算法的独立变化。
  2. 消除条件语句:通过使用策略模式,可以避免在上下文类中使用大量的条件语句。
  3. 提高代码复用性:不同的策略类可以复用相同的算法接口,提高代码的复用性和可维护性。
缺点
  1. 增加类的数量:每个策略都是一个单独的类,可能会增加类的数量,导致代码复杂度增加。
  2. 策略切换的开销:在运行时切换策略可能会带来一些性能开销。

策略模式的适用场景

  1. 算法需要在运行时选择:当一个系统需要在运行时从多个算法中选择一个时,可以使用策略模式。
  2. 避免条件语句:当一个类中包含大量与算法选择相关的条件语句时,可以使用策略模式消除这些条件语句。
  3. 需要重用算法:当多个类需要复用相同的算法时,可以将这些算法提取到独立的策略类中,通过策略模式进行重用。

总结

策略模式是一种行为型设计模式,通过定义一系列算法并将每个算法封装起来,使它们可以互相替换,从而实现算法的独立变化和复用。策略模式可以提高代码的灵活性和可维护性,适用于算法需要在运行时选择或消除条件语句的场景。合理使用策略模式,可以显著提高代码的质量和设计水平。

相关推荐
弱冠少年21 分钟前
websockets库使用(基于Python)
开发语言·python·numpy
MinBadGuy30 分钟前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
刷帅耍帅44 分钟前
设计模式-生成器模式/建造者模式Builder
设计模式·建造者模式
技术无疆44 分钟前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
羊小猪~~1 小时前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
qq_273900231 小时前
解析TMalign文本文件中的转换矩阵
python·生物信息学
阿华的代码王国2 小时前
【JavaEE】——文件IO的应用
开发语言·python
电饭叔2 小时前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
程序猿小D3 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
杰哥在此4 小时前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程