python中兩種策略模式的實(shí)現(xiàn)方法示例
1. 基于接口/抽象類(lèi)的實(shí)現(xiàn)(含繼承)
這是經(jīng)典策略模式的定義方式,必然包含繼承關(guān)系:
from abc import ABC, abstractmethod # 抽象策略類(lèi)(必須繼承) class TextSplitterStrategy(ABC): @abstractmethod def split(self, text: str) -> list[str]: pass # 具體策略類(lèi)(繼承抽象類(lèi)) class RecursiveSplitter(TextSplitterStrategy): def split(self, text: str) -> list[str]: # 實(shí)現(xiàn)遞歸分割邏輯 return chunks class TokenSplitter(TextSplitterStrategy): def split(self, text: str) -> list[str]: # 實(shí)現(xiàn)按token分割邏輯 return chunks # 上下文類(lèi)(選擇策略) class TextProcessor: def __init__(self, strategy: TextSplitterStrategy): self._strategy = strategy def process(self, text: str) -> list[str]: return self._strategy.split(text)
繼承關(guān)系:
TextSplitterStrategy (抽象基類(lèi))
├── RecursiveSplitter
├── TokenSplitter
└── OtherSplitters
實(shí)際使用方法:
方式1:運(yùn)行時(shí)動(dòng)態(tài)指定策略(顯式選擇)
適用場(chǎng)景:需要在代碼中根據(jù)不同條件靈活切換策略
操作方法:
在創(chuàng)建
TextProcessor
時(shí),顯式傳入具體的策略實(shí)例策略實(shí)例可通過(guò)條件判斷、配置參數(shù)或用戶(hù)輸入決定
# 根據(jù)不同條件選擇策略 if use_case == "code": strategy = TokenSplitter() # 選擇Token分割策略 elif use_case == "document": strategy = RecursiveSplitter() # 選擇遞歸分割策略 else: strategy = DefaultSplitter() # 創(chuàng)建處理器并傳入策略 processor = TextProcessor(strategy=strategy) # 使用處理器 result = processor.process("your_text_here")
方式2:通過(guò)工廠類(lèi)/函數(shù)封裝選擇邏輯(隱式選擇)
適用場(chǎng)景:希望隱藏策略選擇細(xì)節(jié),簡(jiǎn)化調(diào)用方代碼
操作方法:
定義一個(gè)策略工廠函數(shù)或類(lèi)
根據(jù)輸入?yún)?shù)(如字符串標(biāo)識(shí))返回對(duì)應(yīng)策略
def get_splitter(strategy_name: str) -> TextSplitterStrategy: """策略工廠函數(shù)""" strategies = { "recursive": RecursiveSplitter, "token": TokenSplitter, # 可擴(kuò)展其他策略... } if strategy_name not in strategies: raise ValueError(f"Unknown strategy: {strategy_name}") return strategies[strategy_name]() # 使用工廠創(chuàng)建策略 strategy = get_splitter("token") # 通過(guò)字符串標(biāo)識(shí)選擇 processor = TextProcessor(strategy=strategy) result = processor.process("your_text_here")
2. 基于函數(shù)的實(shí)現(xiàn)(無(wú)繼承)
Python支持函數(shù)作為一等對(duì)象,策略模式可以完全不用繼承:
# 策略定義為普通函數(shù) def recursive_split(text: str) -> list[str]: return chunks def token_split(text: str) -> list[str]: return chunks # 上下文通過(guò)函數(shù)調(diào)用選擇策略 class TextProcessor: def __init__(self, split_strategy: callable): self._split = split_strategy def process(self, text: str) -> list[str]: return self._split(text)
無(wú)繼承關(guān)系,僅依賴(lài)函數(shù)簽名一致性(鴨子類(lèi)型)。
基礎(chǔ)使用方式
1. 直接傳遞策略函數(shù)
# 定義策略函數(shù) 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() # 示例:按空格分詞 # 創(chuàng)建處理器時(shí)注入策略函數(shù) processor = TextProcessor(split_strategy=recursive_split) # 使用遞歸分割 # 處理文本 result = processor.process("這是一段需要分割的文本,長(zhǎng)度超過(guò)100個(gè)字符時(shí)應(yīng)自動(dòng)分割...") print(result)
進(jìn)階使用方式
(1) 帶參數(shù)的策略函數(shù)
# 策略函數(shù)支持參數(shù) 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綁定參數(shù) from functools import partial # 創(chuàng)建固定參數(shù)的策略 custom_split = partial(dynamic_split, chunk_size=30) processor = TextProcessor(split_strategy=custom_split)
(2) 策略工廠函數(shù)
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] # 通過(guò)工廠獲取策略 strategy = get_strategy("dynamic", chunk_size=40) processor = TextProcessor(strategy)
總結(jié)
到此這篇關(guān)于python中兩種策略模式的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)python策略模式實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中進(jìn)程和線(xiàn)程的區(qū)別詳解
這篇文章主要介紹了Python中進(jìn)程和線(xiàn)程的區(qū)別詳解,需要的朋友可以參考下2017-10-10Python實(shí)現(xiàn)批量獲取地址的經(jīng)緯度
在地理分析中,通常需要自己獲取經(jīng)緯度數(shù)據(jù),所以本文就來(lái)和大家介紹一下如何借助python與地圖接口來(lái)進(jìn)行經(jīng)緯度的爬取,感興趣的小伙伴可以了解下2025-05-05python實(shí)現(xiàn)飛機(jī)大戰(zhàn)微信小游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)飛機(jī)大戰(zhàn)微信小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Python3 實(shí)現(xiàn)將bytes圖片轉(zhuǎn)jpg格式
這篇文章主要介紹了Python3 實(shí)現(xiàn)將bytes圖片轉(zhuǎn)jpg格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python使用描述器實(shí)現(xiàn)ORM模型的方法詳解
這篇文章主要為大家詳細(xì)介紹了Python描述器實(shí)現(xiàn)ORM模型,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02matplotlib?雙y軸繪制及合并圖例的實(shí)現(xiàn)代碼
這篇文章主要介紹了matplotlib?雙y軸繪制及合并圖例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10處理python中多線(xiàn)程與多進(jìn)程中的數(shù)據(jù)共享問(wèn)題
這篇文章主要介紹了python中多線(xiàn)程與多進(jìn)程中的數(shù)據(jù)共享問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07探索Python元類(lèi)的魅力:靈活定制類(lèi)的創(chuàng)建過(guò)程
在Python編程中,元類(lèi)(Metaclass)是一項(xiàng)高級(jí)特性,它允許我們?cè)诙x類(lèi)的時(shí)候動(dòng)態(tài)地控制類(lèi)的創(chuàng)建過(guò)程。元類(lèi)提供了一種強(qiáng)大的機(jī)制,可以對(duì)類(lèi)進(jìn)行定制化,擴(kuò)展其功能,并在類(lèi)的實(shí)例化過(guò)程中執(zhí)行額外的操作,本文將深入解析2023-10-10