设计模式之策略模式¶
成为你所能成为的最好的自己。
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语句来处理不同的算法,这会使得代码变得复杂、难以维护和扩展。
-
可以提高代码的可读性和可维护性。策略模式将算法的实现从客户端代码中分离出来,使得代码更加简洁、清晰和易于理解。
-
可以支持不同的算法组合。通过将算法封装成独立的策略类,可以方便地实现不同的算法组合,从而满足不同的需求。
-
可以提高代码的重用性。如果需要在不同的应用场景中使用相同的算法,可以将这些算法封装成独立的策略类,并在不同的应用场景中复用这些策略类。
缺点¶
-
增加了类的数量。策略模式需要定义多个策略类来实现不同的算法,这样就会增加类的数量,使得代码变得复杂。
-
客户端需要了解不同的策略类。客户端需要知道不同的策略类,才能选择合适的算法,这可能会增加客户端代码的复杂性。
-
策略模式可能会导致性能下降。如果使用策略模式来处理简单的算法,可能会因为多次调用策略类的方法而导致性能下降。
-
策略模式可能会导致代码重构。如果需要添加新的算法,可能需要创建新的策略类,并修改环境类的代码,这可能会导致代码重构。