python中两种策略模式的实现方法示例

 更新时间:2025年07月04日 08:46:16   作者:热爱生活的猴子  
策略模式是一种行为型设计模式,它将一组可互换的算法封装成独立的类,使它们可以在运行时灵活切换,这篇文章主要介绍了python中两种策略模式的实现方法的相关资料,需要的朋友可以参考下

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 chunks

class 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 chunks

def 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凭借其强大的可视化库(如Matplotlib、Seaborn)成为进行EDA的首选工具,本文基于一份实用的Python数据可视化速查表,系统介绍从单变量到多变量、从时间序列到文本数据的可视化方法,需要的朋友可以参考下
    2026-01-01
  • Python对象转换为json的方法步骤

    Python对象转换为json的方法步骤

    这篇文章主要介绍了Python对象转换为json的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • pytorch中Tensor.new()的使用解析

    pytorch中Tensor.new()的使用解析

    这篇文章主要介绍了pytorch中Tensor.new()的使用解析,Tensor.new()是创建一个新的Tensor,该Tensor的type和device都和原有Tensor一致,且无内容,需要的朋友可以参考下
    2023-09-09
  • Python解决爬虫程序卡死问题

    Python解决爬虫程序卡死问题

    这篇文章主要介绍了Python解决爬虫程序卡死问题,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • flask入门之表单的实现

    flask入门之表单的实现

    这篇文章主要介绍了flask入门之表单的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 使用python爬取抖音视频列表信息

    使用python爬取抖音视频列表信息

    这篇文章主要介绍了如何用python爬取抖音视频列表信息,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 解决使用export_graphviz可视化树报错的问题

    解决使用export_graphviz可视化树报错的问题

    今天小编就为大家分享一篇解决使用export_graphviz可视化树报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python如何实现wifi自动连接,解决电脑wifi经常断开问题

    python如何实现wifi自动连接,解决电脑wifi经常断开问题

    这篇文章主要介绍了python实现wifi自动连接,解决电脑wifi经常断开的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Python中的Django基本命令实例详解

    Python中的Django基本命令实例详解

    这篇文章主要介绍了Python之Django基本命令 ,需要的朋友可以参考下
    2018-07-07
  • Python单向链表和双向链表原理与用法实例详解

    Python单向链表和双向链表原理与用法实例详解

    这篇文章主要介绍了Python单向链表和双向链表原理与用法,结合实例形式详细分析了单向链表与双向链表的概念、原理以及创建、添加、删除等相关操作技巧,需要的朋友可以参考下
    2018-08-08

最新评论