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中进程和线程的区别详解,需要的朋友可以参考下
    2017-10-10
  • Python实现批量获取地址的经纬度

    Python实现批量获取地址的经纬度

    在地理分析中,通常需要自己获取经纬度数据,所以本文就来和大家介绍一下如何借助python与地图接口来进行经纬度的爬取,感兴趣的小伙伴可以了解下
    2025-05-05
  • python实现飞机大战微信小游戏

    python实现飞机大战微信小游戏

    这篇文章主要为大家详细介绍了python实现飞机大战微信小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Python3 实现将bytes图片转jpg格式

    Python3 实现将bytes图片转jpg格式

    这篇文章主要介绍了Python3 实现将bytes图片转jpg格式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python使用描述器实现ORM模型的方法详解

    Python使用描述器实现ORM模型的方法详解

    这篇文章主要为大家详细介绍了Python描述器实现ORM模型,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • matplotlib 双y轴绘制及合并图例的实现代码

    matplotlib 双y轴绘制及合并图例的实现代码

    这篇文章主要介绍了matplotlib 双y轴绘制及合并图例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 处理python中多线程与多进程中的数据共享问题

    处理python中多线程与多进程中的数据共享问题

    这篇文章主要介绍了python中多线程与多进程中的数据共享问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Django中models.model如何使用举例详解

    Django中models.model如何使用举例详解

    在现代Web开发中Django是一个非常流行的Web框架,它允许开发者快速构建强大而优雅的Web应用程序,这篇文章主要介绍了Django中models.model如何使用的相关资料,需要的朋友可以参考下
    2025-04-04
  • 探索Python元类的魅力:灵活定制类的创建过程

    探索Python元类的魅力:灵活定制类的创建过程

    在Python编程中,元类(Metaclass)是一项高级特性,它允许我们在定义类的时候动态地控制类的创建过程。元类提供了一种强大的机制,可以对类进行定制化,扩展其功能,并在类的实例化过程中执行额外的操作,本文将深入解析
    2023-10-10
  • Python实现豆瓣图片下载的方法

    Python实现豆瓣图片下载的方法

    这篇文章主要介绍了Python实现豆瓣图片下载的方法,涉及Python针对网页操作的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论