python中兩種策略模式的實現(xiàn)方法示例
1. 基于接口/抽象類的實現(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]:
# 實現(xiàn)遞歸分割邏輯
return chunks
class TokenSplitter(TextSplitterStrategy):
def split(self, text: str) -> list[str]:
# 實現(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
實際使用方法:
方式1:運行時動態(tài)指定策略(顯式選擇)
適用場景:需要在代碼中根據(jù)不同條件靈活切換策略
操作方法:
在創(chuàng)建
TextProcessor時,顯式傳入具體的策略實例策略實例可通過條件判斷、配置參數(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ù)封裝選擇邏輯(隱式選擇)
適用場景:希望隱藏策略選擇細節(jié),簡化調(diào)用方代碼
操作方法:
定義一個策略工廠函數(shù)或類
根據(jù)輸入?yún)?shù)(如字符串標識)返回對應(yīng)策略
def get_splitter(strategy_name: str) -> TextSplitterStrategy:
"""策略工廠函數(shù)"""
strategies = {
"recursive": RecursiveSplitter,
"token": TokenSplitter,
# 可擴展其他策略...
}
if strategy_name not in strategies:
raise ValueError(f"Unknown strategy: {strategy_name}")
return strategies[strategy_name]()
# 使用工廠創(chuàng)建策略
strategy = get_splitter("token") # 通過字符串標識選擇
processor = TextProcessor(strategy=strategy)
result = processor.process("your_text_here")2. 基于函數(shù)的實現(xiàn)(無繼承)
Python支持函數(shù)作為一等對象,策略模式可以完全不用繼承:
# 策略定義為普通函數(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)無繼承關(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ù)
processor = TextProcessor(split_strategy=recursive_split) # 使用遞歸分割
# 處理文本
result = processor.process("這是一段需要分割的文本,長度超過100個字符時應(yīng)自動分割...")
print(result)進階使用方式
(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中兩種策略模式的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)python策略模式實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)批量獲取地址的經(jīng)緯度
在地理分析中,通常需要自己獲取經(jīng)緯度數(shù)據(jù),所以本文就來和大家介紹一下如何借助python與地圖接口來進行經(jīng)緯度的爬取,感興趣的小伙伴可以了解下2025-05-05
Python3 實現(xiàn)將bytes圖片轉(zhuǎn)jpg格式
這篇文章主要介紹了Python3 實現(xiàn)將bytes圖片轉(zhuǎn)jpg格式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
matplotlib?雙y軸繪制及合并圖例的實現(xiàn)代碼
這篇文章主要介紹了matplotlib?雙y軸繪制及合并圖例,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10
處理python中多線程與多進程中的數(shù)據(jù)共享問題
這篇文章主要介紹了python中多線程與多進程中的數(shù)據(jù)共享問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
探索Python元類的魅力:靈活定制類的創(chuàng)建過程
在Python編程中,元類(Metaclass)是一項高級特性,它允許我們在定義類的時候動態(tài)地控制類的創(chuàng)建過程。元類提供了一種強大的機制,可以對類進行定制化,擴展其功能,并在類的實例化過程中執(zhí)行額外的操作,本文將深入解析2023-10-10

