策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式涉及到一个待执行的动作和一组将这个动作与特定对象关联的策略。策略模式的主要优点是提供了管理相关的算法族的办法。策略模式的主要缺点是策略类会随着系统复杂度的增加而增加。策略模式适用于需要在不同时间应用不同业务规则的场景。
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为,在策略模式中,一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变的上下文对象,策略对象改变上下文对象的执行算法。
策略模式的主要优点是提供了管理相关的算法族的办法,策略类的等级结构定义了一个算法或行为族,恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
策略模式对调用者屏蔽了策略制定的复杂性,使得策略的变化不会影响到调用者。
策略模式的优缺点如下:
1、策略模式的优点:
- 策略类之间可以自由切换,由于它们之间没有任何关系,所以改变策略就像改变对象一样简单。
- 易于扩展和维护,由于每个具体策略都是独立的类,因此可以选择新的具体策略来增加程序的灵活性。
- 客户端代码简化,由于策略模式将选择逻辑转移到客户端代码中,因此客户端代码可以更简洁。
2、策略模式的缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一种策略,这就意味着客户端必须理解每一个策略需要做什么,换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
- 由于策略模式的策略类都封装了各自的业务处理方法,且相互独立,因此如果需要修改客户端代码,可能需要修改每个策略类中的代码。
策略模式的使用场景包括:
- 在一个系统里面有许多类,它们之间的区别仅在于它们的行为,Strategy模式可以动态地让一个对象在许多行为中选择一种行为;
- 一个类定义了多种行为,并且这些行为都有一个公共的接口,此时可以使用策略模式,这个类为每种行为都提供一个封装;
- 如果一个系统中有一个接口,提供了多个行为,那么可以使用策略模式,将这些算法封装起来;
- 当一个类的行为需要在运行时根据环境或用户输入等因素来决定时,可以使用策略模式;
- 如果你想在系统中创建一个算法族,并且某些算法中的步骤想以一个算法的步骤而定,可以使用策略模式;
- 如果你有几个类,它们之间的区别仅在于它们的外观和行为,可以使用策略模式,将这些不同的表现封装起来。
策略模式通常涉及三个角色:
- 抽象策略角色(Strategy):负责定义一组算法,分别封装起来,并使它们可相互替换,此角色也负责定义算法使用的上下文数据。
- 具体策略角色(ConcreteStrategy):包装了相关的算法或行为。
- 环境角色(Context):负责维持一个对策略对象的引用,定义一些接口以让客户端可以访问它的算法列表。
下面是一个简单的策略模式示例:
from abc import ABC, abstractmethod 策略接口 class Strategy(ABC): @abstractmethod def execute(self, a: int, b: int) -> int: pass 具体策略A class ConcreteStrategyA(Strategy): def execute(self, a: int, b: int) -> int: return a + b 具体策略B class ConcreteStrategyB(Strategy): def execute(self, a: int, b: int) -> int: return a - b 上下文 class Context: def __init__(self, strategy: Strategy): self._strategy = strategy @property def strategy(self) -> Strategy: return self._strategy @strategy.setter def strategy(self, strategy: Strategy) -> None: self._strategy = strategy def do_something(self, a: int, b: int) -> int: return self._strategy.execute(a, b) 客户端代码 if __name__ == "__main__": context = Context(ConcreteStrategyA()) print(context.do_something(1, 2)) # 输出3 context.strategy = ConcreteStrategyB() print(context.do_something(1, 2)) # 输出-1
策略模式是一种非常有用的设计模式,它可以帮助我们在运行时改变对象的行为,从而提供更大的灵活性和可扩展性,它也有一定的缺点,例如客户端必须知道所有可用的策略类,并且可能需要修改每个策略类中的代码才能修改客户端代码,在使用策略模式时,我们需要仔细权衡其优缺点,并根据实际需求进行选择。