python中兩種策略模式的實(shí)現(xiàn)方法示例
1. 基于接口/抽象類的實(shí)現(xiàn)(含繼承)
這是經(jīng)典策略模式的定義方式,必然包含繼承關(guān)系:
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]:
# 實(shí)現(xiàn)遞歸分割邏輯
return chunks
class TokenSplitter(TextSplitterStrategy):
def split(self, text: str) -> list[str]:
# 實(shí)現(xiàn)按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)繼承關(guān)系:
TextSplitterStrategy (抽象基類)
├── RecursiveSplitter
├── TokenSplitter
└── OtherSplitters
實(shí)際使用方法:
方式1:運(yùn)行時(shí)動(dòng)態(tài)指定策略(顯式選擇)
適用場(chǎng)景:需要在代碼中根據(jù)不同條件靈活切換策略
操作方法:
在創(chuàng)建
TextProcessor時(shí),顯式傳入具體的策略實(shí)例策略實(shí)例可通過條件判斷、配置參數(shù)或用戶輸入決定
# 根據(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:通過工廠類/函數(shù)封裝選擇邏輯(隱式選擇)
適用場(chǎng)景:希望隱藏策略選擇細(xì)節(jié),簡(jiǎn)化調(diào)用方代碼
操作方法:
定義一個(gè)策略工廠函數(shù)或類
根據(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") # 通過字符串標(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
# 上下文通過函數(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)系,僅依賴函數(shù)簽名一致性(鴨子類型)。
基礎(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)度超過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]
# 通過工廠獲取策略
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數(shù)據(jù)可視化之從單變量到多變量的方法
Python憑借其強(qiáng)大的可視化庫(kù)(如Matplotlib、Seaborn)成為進(jìn)行EDA的首選工具,本文基于一份實(shí)用的Python數(shù)據(jù)可視化速查表,系統(tǒng)介紹從單變量到多變量、從時(shí)間序列到文本數(shù)據(jù)的可視化方法,需要的朋友可以參考下2026-01-01
Python對(duì)象轉(zhuǎn)換為json的方法步驟
這篇文章主要介紹了Python對(duì)象轉(zhuǎn)換為json的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-08-08
python如何實(shí)現(xiàn)wifi自動(dòng)連接,解決電腦wifi經(jīng)常斷開問題
這篇文章主要介紹了python實(shí)現(xiàn)wifi自動(dòng)連接,解決電腦wifi經(jīng)常斷開的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06

