Skip to content

设计模式之策略模式

成为你所能成为的最好的自己。

Author: 李东阳

1、什么是策略模式

内容

定义一系列的算法,把他们一个个封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户变化而变化。

角色

  • 抽象策略(Strategy)

  • 具体策略(Concrete Strategy)

  • 上下文(Context)

2、策略模式的实现

策略模式很简单,很容易理解,直接上代码:

# 策略接口
class Strategy:
    def do_operation(self, num1, num2):
        pass

# 加法策略
class AddStrategy(Strategy):
    def do_operation(self, num1, num2):
        return num1 + num2

# 减法策略
class SubtractStrategy(Strategy):
    def do_operation(self, num1, num2):
        return num1 - num2

# 乘法策略
class MultiplyStrategy(Strategy):
    def do_operation(self, num1, num2):
        return num1 * num2

# 策略上下文
class Context:
    def __init__(self, strategy):
        self.strategy = strategy

    def execute_strategy(self, num1, num2):
        return self.strategy.do_operation(num1, num2)

# 使用示例
if __name__ == '__main__':
    num1, num2 = 10, 5

    add_strategy = AddStrategy()
    context = Context(add_strategy)
    result = context.execute_strategy(num1, num2)
    print(f"num1 + num2 = {result}")

    subtract_strategy = SubtractStrategy()
    context = Context(subtract_strategy)
    result = context.execute_strategy(num1, num2)
    print(f"num1 - num2 = {result}")

    multiply_strategy = MultiplyStrategy()
    context = Context(multiply_strategy)
    result = context.execute_strategy(num1, num2)
    print(f"num1 * num2 = {result}")

3、总结

优点

  • 可以提高代码的灵活性和可扩展性。通过将算法封装成独立的策略类,可以在运行时动态地切换算法而不需要修改客户端代码。

  • 可以避免大量的条件语句和switch语句。如果不使用策略模式,可能需要编写很多条件语句或switch语句来处理不同的算法,这会使得代码变得复杂、难以维护和扩展。

  • 可以提高代码的可读性和可维护性。策略模式将算法的实现从客户端代码中分离出来,使得代码更加简洁、清晰和易于理解。

  • 可以支持不同的算法组合。通过将算法封装成独立的策略类,可以方便地实现不同的算法组合,从而满足不同的需求。

  • 可以提高代码的重用性。如果需要在不同的应用场景中使用相同的算法,可以将这些算法封装成独立的策略类,并在不同的应用场景中复用这些策略类。

缺点

  • 增加了类的数量。策略模式需要定义多个策略类来实现不同的算法,这样就会增加类的数量,使得代码变得复杂。

  • 客户端需要了解不同的策略类。客户端需要知道不同的策略类,才能选择合适的算法,这可能会增加客户端代码的复杂性。

  • 策略模式可能会导致性能下降。如果使用策略模式来处理简单的算法,可能会因为多次调用策略类的方法而导致性能下降。

  • 策略模式可能会导致代码重构。如果需要添加新的算法,可能需要创建新的策略类,并修改环境类的代码,这可能会导致代码重构。