策略模式和工厂模式都是常见的设计模式,它们都有各自的特点。工厂模式是一种创建型模式,关注对象的创建;而策略模式是一种行为型模式,关注行为的封装 。,,工厂模式是通过一个工厂类来创建对象,而策略模式则是通过定义一些算法或策略,并在运行时动态选择使用哪一种算法或策略来实现不同的功能 。
本文目录导读:
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法独立于使用它的客户端。
策略模式简介
策略模式是一种结构型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法独立于使用它的客户端。
策略模式的主要角色有:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作。
3、上下文(Context):持有一个策略类的引用,提供给客户端调用。
策略模式的优点
1、解耦:策略模式将算法与使用算法的客户端分离,使得客户端只需要关注自己的业务逻辑,而不需要关心具体的算法实现。
2、可扩展性:当需要添加新的算法时,只需实现一个新的具体策略类即可,无需修改原有的代码。
3、易于维护:由于策略模式将算法与客户端分离,因此在修改算法时,只需修改具体策略类即可,无需修改使用算法的客户端代码。
策略模式的缺点
1、额外的开销:由于需要为每个具体策略类创建一个实例,因此在运行时会增加一定的开销。
2、可能会导致死锁:当多个客户端同时请求同一个具体策略类的实例时,可能会发生死锁现象。
策略模式的应用场景
1、当一个系统需要支持多种排序算法时,可以使用策略模式。
2、当一个系统需要根据不同的条件执行不同的操作时,可以使用策略模式。
3、当一个系统需要支持动态切换算法时,可以使用策略模式。
策略模式的实现步骤
1、定义抽象策略类,声明所有支持的算法接口。
2、实现具体策略类,实现抽象策略类中的操作。
3、定义上下文类,持有一个策略类的引用,提供给客户端调用。
4、在客户端中,根据需要选择合适的策略类,并通过上下文类调用相应的操作。
下面是一个简单的策略模式示例:
from abc import ABC, abstractmethod 抽象策略类 class Strategy(ABC): @abstractmethod def execute(self, data): pass 具体策略类A class ConcreteStrategyA(Strategy): def execute(self, data): return sorted(data) 具体策略类B class ConcreteStrategyB(Strategy): def execute(self, data): return sorted(data, reverse=True) 上下文类 class Context: def __init__(self, strategy: Strategy): self._strategy = strategy def set_strategy(self, strategy: Strategy): self._strategy = strategy def execute_strategy(self, data): return self._strategy.execute(data)
在客户端中使用策略模式:
if __name__ == "__main__": data = [3, 1, 4, 1, 5, 9] strats = [ConcreteStrategyA(), ConcreteStrategyB()] c = Context(strats[0]) # 默认使用具体策略A进行排序 print("使用具体策略A排序:", c.execute_strategy(data)) c.set_strategy(strats[1]) # 根据需要切换到具体策略B进行排序 print("使用具体策略B排序:", c.execute_strategy(data))