策略模式和工厂模式都是设计模式中的优秀选择。工厂模式关注对象创建,而策略模式关注算法多样性。两者都是为提高代码灵活性和可维护性。
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
在编程领域,我们经常会遇到需要根据不同条件执行不同操作的情况,一个计算器程序可能需要根据用户输入的数字类型(整数、浮点数或复数)来执行不同的运算,这时,我们可以使用策略模式来实现这个功能。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略的具体算法。
3、上下文(Context):持有一个策略对象的引用,供客户端调用其方法。
4、客户端(Client):使用上下文对象来调用具体策略的方法。
下面我们通过一个简单的例子来说明如何使用策略模式:
假设我们有一个计算器程序,它可以执行加法、减法、乘法和除法运算,我们可以使用策略模式来实现这个程序,我们需要定义一个抽象策略类OperationStrategy
,它包含一个公共方法execute
,用于执行相应的运算,我们需要为每种运算实现一个具体的策略类,如AddOperationStrategy
、SubtractOperationStrategy
等,我们需要定义一个上下文类CalculatorContext
,它持有一个策略对象的引用,并提供一个方法executeOperation
,用于调用具体策略的execute
方法,客户端只需要创建一个上下文对象,并传入相应的策略对象即可。
下面是一个简单的Python实现:
from abc import ABC, abstractmethod 抽象策略 class OperationStrategy(ABC): @abstractmethod def execute(self, a, b): pass 具体策略:加法 class AddOperationStrategy(OperationStrategy): def execute(self, a, b): return a + b 具体策略:减法 class SubtractOperationStrategy(OperationStrategy): def execute(self, a, b): return a - b 具体策略:乘法 class MultiplyOperationStrategy(OperationStrategy): def execute(self, a, b): return a * b 具体策略:除法 class DivideOperationStrategy(OperationStrategy): def execute(self, a, b): if b == 0: raise ValueError("除数不能为0") return a / b 上下文类 class CalculatorContext: def __init__(self, strategy: OperationStrategy): self._strategy = strategy def set_strategy(self, strategy: OperationStrategy): self._strategy = strategy def execute_operation(self, a, b): return self._strategy.execute(a, b)
客户端代码如下:
创建上下文对象,并传入加法策略对象 calculator = CalculatorContext(AddOperationStrategy()) result = calculator.execute_operation(1, 2) print("1 + 2 =", result) 修改上下文对象的策略为减法策略对象,并重新执行加法运算 calculator.set_strategy(SubtractOperationStrategy()) result = calculator.execute_operation(1, 2) print("1 - 2 =", result)