策略模式和工厂模式都是行为型设计模式,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性 。
在编程中,设计模式是一种解决问题的模板或蓝图,它们提供了一种在特定情况下解决常见问题的通用解决方案,我们将深入探讨一种被称为“策略模式”的设计模式。
策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,使算法的变化不会影响到使用算法的客户,策略模式让算法的变化独立于使用它的客户。
让我们来看看什么是策略模式,在软件设计中,策略模式允许你根据运行时情况选择算法的行为,这意味着你可以在不改变客户端代码的情况下更改算法。
策略模式包含三个主要角色:
Context(上下文):持有一个策略类的引用,这个类的实例应该在运行时知道。
Strategy(策略):定义所有支持的算法,它们没有共同的接口。
ConcreteStrategy(具体策略):实现每个策略的具体算法。
下面是一个简单的示例,说明如何在Python中实现策略模式:
```python
from abc import ABC, abstractmethod
Context (抽象上下文)
class Context(ABC):
@abstractmethod
def execute_strategy(self, strategy: 'Strategy') -> Any:
pass
Strategy (抽象策略)
class Strategy(ABC):
@abstractmethod
def do_operation(self, num1: int, num2: int) -> int:
pass
Concrete Strategy A
class AddStrategy(Strategy):
def do_operation(self, num1: int, num2: int) -> int:
return num1 + num2
Concrete Strategy B
class SubtractStrategy(Strategy):
def do_operation(self, num1: int, num2: int) -> int:
return num1 - num2
Concrete Context (具体上下文)
class ConcreteContext(Context):
def __init__(self, strategy: Strategy):
self._strategy = strategy
def set_strategy(self, strategy: Strategy) -> None:
self._strategy = strategy
def execute_strategy(self, strategy: Strategy) -> Any:
return self._strategy.do_operation(5,3) # example numbers to use the strategies above........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................