策略模式和工厂模式都是常用的设计模式,它们在不同的场景中发挥着重要作用。工厂模式关注对象创建,而策略模式关注算法多样性。 ,,工厂模式是一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。而策略模式则是一种行为型设计模式,可以在运行时动态切换不同的算法或策略。
本文目录导读:
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要角色
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(Concrete Strategy):实现抽象策略中的操作,即具体的算法实现。
3、上下文(Context):持有一个策略对象的引用,提供给客户端调用。
策略模式的优点
1、解耦:将算法的实现与使用它的客户端分离,使得两者之间的依赖关系降低。
2、可扩展性:当需要添加新的算法时,只需增加一个新的具体策略类即可,无需修改客户端代码。
3、易于维护:当需要修改算法时,只需修改具体策略类即可,无需修改使用算法的客户端代码。
策略模式的实现步骤
1、确定问题域:明确需要解决的问题,以及支持的算法类型。
2、创建策略接口:定义所有支持的算法的公共接口。
3、实现具体策略:根据问题域,实现策略接口的具体策略类。
4、创建上下文:持有一个策略对象的引用,提供给客户端调用。
5、使用策略:客户端通过上下文对象调用具体策略的方法来执行相应的算法。
以下是一个简单的策略模式示例:
from abc import ABC, abstractmethod 1. 抽象策略(Strategy) class Strategy(ABC): @abstractmethod def execute(self, a, b): pass 2. 具体策略(Concrete Strategy A) class ConcreteStrategyA(Strategy): def execute(self, a, b): return a + b 3. 具体策略(Concrete Strategy B) class ConcreteStrategyB(Strategy): def execute(self, a, b): return a * b 4. 上下文(Context) class Context: def __init__(self, strategy: Strategy): self._strategy = strategy def set_strategy(self, strategy: Strategy): self._strategy = strategy def execute_strategy(self, a, b): return self._strategy.execute(a, b) 5. 客户端代码 if __name__ == "__main__": context = Context(ConcreteStrategyA()) print("使用具体策略A计算结果:", context.execute_strategy(3, 4)) context.set_strategy(ConcreteStrategyB()) print("使用具体策略B计算结果:", context.execute_strategy(3, 4))
在这个示例中,我们定义了一个抽象策略Strategy
,它有一个execute
方法用于计算两个数的和或积,然后我们实现了两个具体策略ConcreteStrategyA
和ConcreteStrategyB
,分别实现了加法和乘法操作,我们创建了一个Context
对象,它持有一个策略对象的引用,并提供了一个execute_strategy
方法供客户端调用,客户端可以通过调用set_strategy
方法来切换使用不同的策略。