策略模式和工厂模式都是面向对象设计模式,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性。
本文目录导读:
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式简介
策略模式是一种行为型设计模式,它的主要目的是将一组算法封装到一系列可互换的类中,这些类实现了同一接口,从而使得这些类可以相互替换,策略模式可以让算法的变化独立于使用它们的客户端。
策略模式的构成要素
1、上下文(Context):定义了所有支持的策略类的公共接口,用于在运行时选择具体的策略类。
2、抽象策略(Strategy):定义了所有支持的策略类的公共接口,包括一个纯虚方法,用于在运行时选择具体的策略类。
3、具体策略(ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC):实现抽象策略中的抽象方法,提供具体的策略实现。
4、客户端(Client):使用上下文对象调用具体策略的方法。
策略模式的优点
1、提高了代码的可扩展性:当需要更换算法时,只需更换具体策略类即可,无需修改使用算法的客户端代码。
2、降低了系统的耦合度:具体策略类与使用算法的客户端解耦,使得系统更加灵活。
3、便于维护:当需要修改算法时,只需修改具体策略类即可,无需修改使用算法的客户端代码。
策略模式的适用场景
1、当需要在运行时动态地选择算法或策略时,可以使用策略模式。
2、当多个算法具有相同的接口时,可以使用策略模式将它们组织在一起。
3、当需要避免使用多重条件判断语句时,可以使用策略模式。
策略模式的实现步骤
1、确定需要使用的策略类及其数量。
2、为每个策略类创建一个实现上下文接口的具体策略类。
3、在客户端代码中,使用上下文对象调用具体策略的方法。
4、根据需要,可以在运行时动态地切换具体策略类。
策略模式的示例代码
from abc import ABC, abstractmethod 上下文类 class Context: def __init__(self, strategy: AbstractStrategy): self._strategy = strategy @property def strategy(self) -> AbstractStrategy: return self._strategy @strategy.setter def strategy(self, strategy: AbstractStrategy): self._strategy = strategy def execute_strategy(self) -> str: return self._strategy.execute() 抽象策略类 class AbstractStrategy(ABC): @abstractmethod def execute(self) -> str: pass 具体策略A类 class ConcreteStrategyA(AbstractStrategy): def execute(self) -> str: return "执行策略A" 具体策略B类 class ConcreteStrategyB(AbstractStrategy): def execute(self) -> str: return "执行策略B" 具体策略C类 class ConcreteStrategyC(AbstractStrategy): def execute(self) -> str: return "执行策略C" 客户端代码 if __name__ == "__main__": context = Context(ConcreteStrategyA()) print(context.execute_strategy()) # 输出:执行策略A context.strategy = ConcreteStrategyB() print(context.execute_strategy()) # 输出:执行策略B