introducing python 2ed python中两种策略模式的实现方
目录
- 1.基于接口/抽象类的实现(含继承)
- 实际使用技巧:
- 方式1:运行时动态指定策略(显式选择)
- 方式2:通过工厂类/函数封装选择逻辑(隐式选择)
- 2. 基于函数的实现(无继承)
- 基础使用方式
- 1. 直接传递策略函数
- 进阶使用方式
- (1) 带参数的策略函数
- (2)策略工厂函数
- 拓展资料
1.基于接口/抽象类的实现(含继承)
这是经典策略模式的定义方式,必然包含继承关系:
from abc import ABC, abstractmethod 抽象策略类(必须继承)class TextSplitterStrategy(ABC): @abstractmethod def split(self, text: str) -> list[str]: pass 具体策略类(继承抽象类)class RecursiveSplitter(TextSplitterStrategy): def split(self, text: str) -> list[str]: 实现递归分割逻辑 return chunksclass TokenSplitter(TextSplitterStrategy): def split(self, text: str) -> list[str]: 实现按token分割逻辑 return chunks 上下文类(选择策略)class TextProcessor: def __init__(self, strategy: TextSplitterStrategy): self._strategy = strategy def process(self, text: str) -> list[str]: return self._strategy.split(text)
继承关系:
TextSplitterStrategy (抽象基类)
├── RecursiveSplitter
├── TokenSplitter
└── OtherSplitters
实际使用技巧:
方式1:运行时动态指定策略(显式选择)
适用场景:需要在代码中根据不同条件灵活切换策略
操作技巧:
-
在创建
TextProcessor时,显式传入具体的策略实例 -
策略实例可通过条件判断、配置参数或用户输入决定
根据不同条件选择策略if use_case == “code”: strategy = TokenSplitter() 选择Token分割策略elif use_case == “document”: strategy = RecursiveSplitter() 选择递归分割策略else: strategy = DefaultSplitter() 创建处理器并传入策略processor = TextProcessor(strategy=strategy) 使用处理器result = processor.process(“your_text_here”)
方式2:通过工厂类/函数封装选择逻辑(隐式选择)
适用场景:希望隐藏策略选择细节,简化调用方代码
操作技巧:
-
定义一个策略工厂函数或类
-
根据输入参数(如字符串标识)返回对应策略
def get_splitter(strategy_name: str) -> TextSplitterStrategy: “””策略工厂函数””” strategies = “recursive”: RecursiveSplitter, “token”: TokenSplitter, 可扩展其他策略… } if strategy_name not in strategies: raise ValueError(f”Unknown strategy: strategy_name}”) return strategies[strategy_name]() 使用工厂创建策略strategy = get_splitter(“token”) 通过字符串标识选择processor = TextProcessor(strategy=strategy)result = processor.process(“your_text_here”)
2. 基于函数的实现(无继承)
Python支持函数作为一等对象,策略模式可以完全不用继承:
策略定义为普通函数def recursive_split(text: str) -> list[str]: return chunksdef token_split(text: str) -> list[str]: return chunks 上下文通过函数调用选择策略class TextProcessor: def __init__(self, split_strategy: callable): self._split = split_strategy def process(self, text: str) -> list[str]: return self._split(text)
无继承关系,仅依赖函数签名一致性(鸭子类型)。
基础使用方式
1. 直接传递策略函数
定义策略函数def recursive_split(text: str) -> list[str]: “””递归分割策略””” return [text[i:i+100] for i in range(0, len(text), 100)] 示例:每100字符分割def token_split(text: str) -> list[str]: “””Token分割策略””” return text.split() 示例:按空格分词 创建处理器时注入策略函数processor = TextProcessor(split_strategy=recursive_split) 使用递归分割 处理文本result = processor.process(“这是一段需要分割的文本,长度超过100个字符时应自动分割…”)print(result)
进阶使用方式
(1) 带参数的策略函数
策略函数支持参数def dynamic_split(text: str, chunk_size: int = 50) -> list[str]: return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)] 使用functools.partial绑定参数from functools import partial 创建固定参数的策略custom_split = partial(dynamic_split, chunk_size=30)processor = TextProcessor(split_strategy=custom_split)
(2)策略工厂函数
def get_strategy(strategy_name: str, params) -> callable: “””策略工厂””” strategies = “recursive”: recursive_split, “token”: token_split, “dynamic”: dynamic_split } if strategy_name == “dynamic”: return partial(dynamic_split, params) return strategies[strategy_name] 通过工厂获取策略strategy = get_strategy(“dynamic”, chunk_size=40)processor = TextProcessor(strategy)
拓展资料
到此这篇关于python中两种策略模式的实现技巧的文章就介绍到这了,更多相关python策略模式实现内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
无论兄弟们可能感兴趣的文章:
- Python设计模式之策略模式实例详解
- 轻松掌握python设计模式之策略模式
- 详解Python设计模式编程中观察者模式与策略模式的运用
- 详解Python设计模式之策略模式
- Python设计模式中的策略模式详解
