《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》

《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》

大家好,我是你的朋友,一位與 Python 代碼相伴多年的開發者。在我們的編程生涯中,幾乎都曾與一種“代碼怪獸”搏斗過,它就是那冗長、復雜、牽一發而動全身的 if-elif-else 結構。

每當一個新的需求傳來——“我們需要增加一種新的導出格式”,“能否支持另一種支付方式?”——我們就不得不硬著頭皮,回到那個巨大的條件判斷語句中,小心翼翼地添加一個 elif 分支。代碼變得越來越臃腫,邏輯越來越混亂,每一次修改都像是在雷區排雷。

這違背了軟件設計中一條至關重要的原則——開閉原則(Open/Closed Principle):軟件實體(類、模塊、函數等)應該對擴展開放,對修改關閉。

那么,如何才能打破這個僵局,寫出既能滿足當前需求,又能從容應對未來變化的代碼呢?今天,我將為你隆重介紹一位“拆彈專家”——策略模式(Strategy Pattern)

在這篇文章中,我們將一起:

  • 直面 if-else 的痛點,理解為什么它會成為代碼質量的瓶頸。
  • 深入掌握策略模式的精髓,學習如何將多變的行為封裝成可互換的“策略”。
  • 探索從經典實現到 Pythonic 風格的演進,看看 Python 的語言特性如何讓這個模式煥發新生。
  • 通過真實案例,將策略模式應用到電商、數據處理等場景,感受其帶來的靈活性與擴展性。

準備好告別糾纏不清的條件判斷,開啟一段代碼重構的優雅之旅了嗎?讓我們開始吧!

第一部分:策略模式的核心思想——“各司其職,按需切換”

策略模式是一種行為設計模式,它定義了一系列算法(策略),并將每一個算法封裝起來,使它們可以相互替換。此模式讓算法的變化獨立于使用算法的客戶端。

聽起來有點抽象?讓我們用一個生活中的例子來理解它:出行旅游

假設你要從家(起點)去一個旅游景點(終點)。你有多種出行策略可供選擇:

  • 策略 A:步行(WalkingStrategy
  • 策略 B:騎行(BikingStrategy
  • 策略 C:駕車(DrivingStrategy

作為“出行者”(我們稱之為 上下文 Context),你并不需要關心每種方式的具體細節(如何走路,如何開車)。你只需要根據當前情況(天氣、距離、預算),選擇一個合適的策略,然后執行“出發”這個動作即可。

策略模式的三個關鍵角色:

  1. 上下文 (Context): 維護一個對策略對象的引用。它不執行具體的算法,而是將工作委托給當前的策略對象。在我們的例子中,就是“出行者” Navigator
  2. 策略接口 (Strategy Interface): 定義所有支持的算法的通用接口。在 Python 中,這通常是一個抽象基類(ABC)或一個簡單的約定。例如,所有出行策略都有一個 route() 方法。
  3. 具體策略 (Concrete Strategy): 實現策略接口的具體算法。例如,WalkingStrategyBikingStrategy 等。

示意圖

+-----------+            +------------------+
|  Context  | <>-------- |    IStrategy     |
| (Navigator)|           | (ABC with route())|
+-----------+            +------------------+^|+-----------------+-----------------+|                 |                 |
+-------------------+ +------------------+ +-------------------+
| ConcreteStrategyA | |ConcreteStrategyB | | ConcreteStrategyC |
| (WalkingStrategy) | | (BikingStrategy) | | (DrivingStrategy) |
+-------------------+ +------------------+ +-------------------+
從零開始的經典實現

讓我們用代碼來實現上述的出行導航場景。

from abc import ABC, abstractmethod# --- 策略接口 ---
class RouteStrategy(ABC):@abstractmethoddef build_route(self, start, end):pass# --- 具體策略 ---
class WalkingStrategy(RouteStrategy):def build_route(self, start, end):print(f"Building walking route from {start} to {end}: Go straight for 500m, turn right...")class BikingStrategy(RouteStrategy):def build_route(self, start, end):print(f"Building biking route from {start} to {end}: Follow the bike lane on Main St..."</

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis--day7--黑馬點評--優惠券秒殺

&#xff08;以下內容全部來自上述課程&#xff09;優惠券秒殺 1. 全局唯一ID 每個店鋪都可以發布優惠券:當用戶搶購時&#xff0c;就會生成訂單并保存到tb voucher order這張表中&#xff0c;而訂單表如果使用數據庫自增ID就存在一些問題: id的規律性太明顯受單表數據量的限制…

Vue 與 React 深度對比:設計哲學、技術差異與應用場景

一、核心設計理念對比 特性 Vue React 設計目標 漸進式框架,降低學習曲線 構建大型應用,保持靈活性 設計哲學 “約定優于配置” “配置優于約定” 核心思想 響應式數據綁定 函數式編程 + 虛擬DOM 模板語言 HTML-based 模板 JSX(JavaScript XML) 狀態管理 內置響應式系統 依…

軟件開發 - foreground 與 background

foreground 與 background 1、foreground詞性含義n.前景&#xff1b;最突出的位置.v使突出&#xff1b;強調# 例詞in the 【foreground】&#xff08;在最顯眼的位置&#xff09;【foreground】 task&#xff08;前臺任務&#xff09;【foreground】 color&#xff08;前景色&a…

深度學習——03 神經網絡(2)-損失函數

2 損失函數 2.1 概述作用&#xff1a;衡量模型預測結果&#xff08;y^\hat{y}y^?&#xff09;和真實標簽&#xff08;yyy&#xff09;的差異&#xff0c;差異越大&#xff0c;說明模型參數“質量越差”&#xff08;需要調整&#xff09;&#xff1b;本質&#xff1a;深度學習訓…

【大模型微調系列-04】 神經網絡基礎與小項目實戰

【大模型微調系列-04】 神經網絡基礎與小項目實戰&#x1f4a1; 本章目標&#xff1a;通過構建一個能識別手寫數字的AI模型&#xff0c;讓你真正理解神經網絡是如何"學習"的。2-3小時后&#xff0c;你將擁有第一個自己訓練的AI模型&#xff01;4.1 理論講解&#xff…

JavaWeb前端(HTML,CSS具體案例)

前言 一直在學習B站黑馬程序員蒼穹外賣。現在已經學的差不多了&#xff0c;但是我學習一直是針對后端開發的&#xff0c;前端也沒太注重去學&#xff08;他大部分都給課程資料嘻嘻&#x1f92a;&#xff09;&#xff0c;但我還是比較感興趣&#xff0c;準備先把之前學JavaWeb&…

核心數據結構:DataFrame

3.3.1 創建與訪問什么是 DataFrame&#xff1f;DataFrame 是 Pandas 中的核心數據結構之一&#xff0c;多行多列表格數據&#xff0c;類似于 Excel 表格 或 SQL 查詢結果。它是一個 二維表格結構&#xff0c;具有行索引&#xff08;index&#xff09;和列標簽&#xff08;colu…

深入探索Go語言標準庫 net 包中的 IP 處理

深入探索Go語言標準庫 net 包中的 IP 處理 文章目錄深入探索Go語言標準庫 net 包中的 IP 處理引言核心知識type IP常用函數常用方法代碼示例常見問題1. DNS 查詢失敗怎么辦&#xff1f;2. 如何區分 IPv4 和 IPv6 地址&#xff1f;使用場景1. 服務器端編程2. 網絡監控和調試3. 防…

2.4 雙向鏈表

目錄 引入 結構定義 結構操作 初始化 插入 刪除 打印 查找 隨機位置插入 隨機位置刪除 銷毀 總結 數據結構專欄https://blog.csdn.net/xyl6716/category_13002640.html 精益求精 追求卓越 【代碼倉庫】&#xff1a;Code Is Here 【合作】 &#xff1a;apollomona…

開發指南132-DOM的寬度、高度屬性

寬度、高度類似。這里以高度為例來說明DOM中有關高度的概念&#xff1a;1、height取法&#xff1a;element.style.height說明&#xff1a;元素內容區域的高度&#xff0c;不含padding、border、margin該屬性可寫2、clientHeight取法&#xff1a;element..clientHeight&#xff…

魔改chromium源碼——解除 iframe 的同源策略

在進行以下操作之前,請確保已完成之前文章中提到的 源碼拉取及編譯 部分。 如果已順利完成相關配置,即可繼續執行后續操作。 同源策略限制了不同源(協議、域名、端口)的網頁腳本訪問彼此的資源。iframe 的跨域限制由 Blink 渲染引擎和 Chromium 的安全層共同實現。 咱們直…

在鴻蒙中實現深色/淺色模式切換:從原理到可運行 Demo

摘要 現在幾乎所有主流應用都支持“深色模式”和“淺色模式”切換&#xff0c;這已經成了用戶習慣。鴻蒙&#xff08;HarmonyOS&#xff09;同樣提供了兩種模式&#xff08;dark / light&#xff09;&#xff0c;并且支持應用根據系統主題切換&#xff0c;或者應用內手動切換。…

Redux搭檔Next.js的簡明使用教程

Redux 是一個用于 JavaScript 應用的狀態管理庫&#xff0c;主要解決組件間共享狀態和復雜狀態邏輯的問題。當應用規模較大、組件層級較深或多個組件需要共享/修改同一狀態時&#xff0c;Redux 可以提供可預測、可追蹤的狀態管理方式&#xff0c;避免狀態在組件間混亂傳遞。Red…

SCAI采用公平發射機制成功登陸LetsBonk,60%代幣供應量已鎖倉

去中心化科學&#xff08;DeSci&#xff09;平臺SCAI宣布&#xff0c;其代幣已于今日以Fair Launch形式在LetsBonk.fun平臺成功發射。為保障資金安全與透明&#xff0c;開發團隊已將代幣總量的60%進行鎖倉&#xff0c;進一步提升社區信任與項目合規性。SCAI是一個專注于高質量科…

【Kubernetes系列】Kubernetes中的resources

博客目錄1. limits&#xff08;資源上限&#xff09;2. requests&#xff08;資源請求&#xff09;關鍵區別其他注意事項示例場景在 Kubernetes (k8s) 中&#xff0c;resources 用于定義容器的資源請求&#xff08;requests&#xff09;和限制&#xff08;limits&#xff09;&a…

hadoop 前端yarn 8088端口查看任務執行情況

圖中資源相關參數含義及簡單分析思路&#xff1a; 基礎資源搶占參數 Total Resource Preempted: <memory:62112, vCores:6> 含義&#xff1a;應用總共被搶占的資源量&#xff0c; memory:62112 表示累計被收回的內存&#xff08;單位通常是MB &#xff0c;結合Hadoop生態…

基于SpringBoot的個性化教育學習平臺的設計與實現(源碼+lw+部署文檔+講解等)

課題介紹在教育數字化轉型與學習者需求差異化的背景下&#xff0c;傳統學習平臺 “統一內容、統一進度” 的模式已顯局限。當前&#xff0c;平臺多提供標準化課程資源&#xff0c;無法根據學習者年齡、基礎、目標&#xff08;如升學、技能提升&#xff09;定制學習路徑&#xf…

UE5多人MOBA+GAS 48、制作閃現技能

文章目錄添加標簽添加GA_Blink添加標簽 CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Teleport)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Cooldown)UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Blink_Teleport, "Ability.Blink.Teleport"…

Swift 實戰:實現一個簡化版的 Twitter(LeetCode 355)

文章目錄摘要描述示例解決答案設計思路題解代碼分析測試示例和結果時間復雜度空間復雜度總結摘要 在社交媒體平臺里&#xff0c;推送機制是核心功能之一。比如你關注了某人&#xff0c;就希望在自己的時間線上能看到他們的最新消息&#xff0c;同時自己的消息也要能出現在別人…

在瀏覽器端使用 xml2js 遇到的報錯及解決方法

在瀏覽器端使用 xml2js 遇到的報錯及解決方法 一、引言 在前端開發過程中&#xff0c;我們常常需要處理 XML 數據。xml2js 是一個非常流行的用于將 XML 轉換為 JavaScript 對象的庫。然而&#xff0c;當我們在瀏覽器端使用它時&#xff0c;可能會遇到一些問題。本文將介紹在瀏覽…