【設計模式】2.策略模式

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

商場收銀軟件為例

1. 基礎版

total = 0def click_ok(price,num):tot = price * numtotal += totprint('合計:', total)

增加打折

total = 0def click_ok(price,num,dis_num):tot = price * numtotal += totif dis_num == '0': # 正常收費passelif dis_num == '8':total *= 0.8elif dis_num == '7':total *= 0.7elif dis_num == '5':total *= 0.5print('合計:', total)

2. 簡單工廠

20250511215044

class cashSuper(ABC):"""收取現金超類"""@abstractmodedef acceptcash(money):"""接收現金抽象類"""passclass cashNormal(cashSuper):"""正常收費子類"""def acceptcash(money):return moneyclass cashRebate(cashSuper):"""打折收費子類"""def cash_rebate(rebate):"""打折"""self.rebate = rebatedef acceptcash(money):return money * self.rebateclass cashReturn(cashSuper):"""返利收費條件"""def cash_return(condition, moneyreturn):self.condition = condition # 返利條件self.moneyreturn = moneyreturndef accpetcash(money):if money >= self.condition:return money - (money-self.condition)*self.moneyreturnreturn money
class CashFactory:@staticmethoddef create_cash_accept(type_str) -> CashSuper:cs = Noneif type_str == "正常收費":cs = CashNormal()elif type_str == "滿 300 返 100":cr1 = CashReturn("300", "100")cs = cr1elif type_str == "打 8 折":cr2 = CashRebate("0.8")cs = cr2return cs

3. 策略模式

20250511221305

class cashSuper(ABC):"""收取現金超類"""@abstractmodedef acceptcash(money):"""接收現金抽象類"""passclass cashNormal(cashSuper):"""正常收費子類"""def acceptcash(money):return moneyclass cashRebate(cashSuper):"""打折收費子類"""def cash_rebate(rebate):"""打折"""self.rebate = rebatedef acceptcash(money):return money * self.rebateclass cashReturn(cashSuper):"""返利收費條件"""def cash_return(condition, moneyreturn):self.condition = condition # 返利條件self.moneyreturn = moneyreturndef accpetcash(money):if money >= self.condition:return money - (money-self.condition)*self.moneyreturnreturn money
class CashContext:def __init__(self, cash_super:cashSuper):self.cs = cash_super  # 通過構造方法傳入具體的收費策略def get_result(self, money):return self.cs.accept_cash(money)  # 根據收費策略計算結果

需要再客戶端判斷哪種收費方式,可進行如下修改

4. 策略和簡單工廠結合

這樣就不用再客戶端里面寫分類代碼了。

# 上下文類
class CashContext:def __init__(self, type: str):self.cs = Noneif type == "正常收費":self.cs = CashNormal()elif type == "滿 300 返 100":self.cs = CashReturn("300", "100")elif type == "打 8 折":self.cs = CashRebate("0.8")else:raise ValueError("無效的收費類型")def get_result(self, money: float) -> float:return self.cs.accept_cash(money)

5. 簡單工廠 VS 策略和簡單工廠結合

客戶端

簡單工廠

# 客戶端代碼
from cash_factory import CashFactory, CashSuper  # 必須導入父類 CashSupertype = "滿 300 返 100"
money = 350# 客戶端需要顯式調用工廠,并知道返回的是 CashSuper 類型
csuper = CashFactory.create_cash_accept(type)  # 客戶端知道 CashSuper 存在
result = csuper.accept_cash(money)            # 客戶端需了解 accept_cash() 方法

策略和簡單工廠結合

# 客戶端代碼
from cash_context import CashContext  # 僅需導入 CashContexttype = "滿 300 返 100"
money = 350# 客戶端只需與 CashContext 交互
csuper = CashContext(type)           # 完全隱藏 CashSuper 和 CashFactory
result = csuper.get_result(money)    # 統一方法名,隱藏具體實現

在簡單工廠中,工廠方法的返回值類型是 CashSuper,客戶端必須:

  1. 知道 CashSuper 是抽象父類

  2. 知道調用 accept_cash() 方法(如 csuper.accept_cash(money))

而策略+工廠模式通過 CashContext 封裝了工廠和策略的細節,客戶端只需調用統一的 get_result()。

小結:

  1. 簡單工廠的耦合體現在:客戶端需直接操作 CashSuper 的接口

  2. 策略+工廠的改進:通過 CashContext 屏蔽底層細節,使客戶端更純粹

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

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

相關文章

c++中的輸入輸出流(標準IO,文件IO,字符串IO)

目錄 &#xff08;1&#xff09;I/O概述 I/O分類 不同I/O的繼承關系 不同I/O對應的頭文件 &#xff08;2&#xff09;iostream 標準I/O流 iostream頭文件中的IO流對象 iostream頭文件中重載了<<和>> 緩沖區示意圖 標準輸入流 cin用法 cin&#xff1a;按空…

人工智能學習06-循環

人工智能學習概述—快手視頻 人工智能學習06-循環—快手視頻

【電路】阻抗匹配

&#x1f4dd; 阻抗匹配 一、什么是阻抗匹配&#xff1f; 阻抗匹配&#xff08;Impedance Matching&#xff09;是指在電子系統中&#xff0c;為了實現最大功率傳輸或最小信號反射&#xff0c;使信號源、傳輸線與負載之間的阻抗達到一種“匹配”狀態的技術。 研究對象&#x…

【vue】Uniapp 打包Android 文件選擇上傳問題詳解~

需求 uniapp兼容android app&#xff0c;pc&#xff0c;h5的文件選擇并上傳功能。 需要支持拍照和相冊選擇&#xff0c;以及選擇其他類型文件上傳~ 實踐過程和問題 開始使用uni-file-picker組件 以為很順利&#xff0c;android模擬器測試…… 忽略了平臺兼容性提示~&#…

Python:操作 Excel 格式化

??Python 操作 Excel 格式化完整指南(openpyxl 與 xlsxwriter 雙方案) 在數據處理和報表自動化中,Python 是一把利器,尤其是配合 Excel 文件的讀寫與格式化處理。本篇將詳細介紹兩大主流庫: openpyxl:適合讀取與修改現有 Excel 文件xlsxwriter:適合創建新文件并進行復…

Prompt Enginering(提示工程)先進技術

前沿 CoT&#xff08;Chain-of-Thought&#xff09;和 ReACT&#xff08;Reasoning and Acting&#xff09;是兩種先進的 Prompt Engineering&#xff08;提示工程&#xff09; 技術&#xff0c;旨在提升大語言模型&#xff08;LLM&#xff09;的推理、規劃和執行能力。 CoT&a…

【C++系列】模板類型特例化

1. C模板類型特例化介紹 ??定義??&#xff1a;模板類型特例化&#xff08;Template Specialization&#xff09;是C中為模板的特定類型提供定制實現的機制&#xff0c;允許開發者對通用模板無法處理的特殊類型進行優化或特殊處理。 ??產生標準??&#xff1a; C98/03…

AI數據分析在體育中的應用:技術與實踐

在現代體育競技領域&#xff0c;"數據驅動"已不再是一個遙遠的概念。尤其隨著人工智能&#xff08;AI&#xff09;和大數據分析的不斷成熟&#xff0c;從職業俱樂部到賽事直播平臺&#xff0c;從運動員訓練到球迷觀賽體驗&#xff0c;AI正以前所未有的方式滲透并改變…

計數思想-眾數

11203-眾數 題目描述(Description) 眾數是指在一組數據中&#xff0c;出現次數最多的數。例如&#xff1a;1, 1, 3 中出現次數最多的數為 1&#xff0c;則眾數為 1。 給定一組數&#xff0c;你能求出眾數嗎&#xff1f; 輸入格式(Format Input) 第 1 行輸入一個整數 n (1 &…

【Go語言基礎【20】】Go的包與工程

文章目錄 零、概述一、包基礎1、包的核心作用2、包的聲明與結構2.1、 包聲明&#xff08;Package Declaration&#xff09;2.2、 包的目錄結構&#xff08;工程視角&#xff09; 3、包的導入與調用3.1、導入包&#xff08;Import Packages&#xff09;3.2、 調用包成員3.3、 導…

《C++初階之入門基礎》【命名空間 + 輸入輸出 + 缺省參數 + 函數重載】

【命名空間 輸入&輸出 缺省參數 函數重載】目錄 前言&#xff1a;---------------hello world---------------比較C語言和C的第一個程序&#xff1a;hello word ---------------命名空間---------------什么是命名空間&#xff1f;怎么使用命名空間&#xff1f;怎么定義…

java綜合項目開發一課一得

文章目錄 Java 綜合項目課程學習&#xff1a;探索與成長之路一、課程初體驗&#xff1a;從理論走向實踐&#xff08;一&#xff09;系統學習 Java 核心理論知識&#xff08;二&#xff09;開啟首個實踐項目 —— 圖書管理系統 二、項目攻堅&#xff1a;挑戰與突破&#xff08;一…

JuiceFS v1.3-Beta2:集成 Apache Ranger,實現更精細化的權限控制

在大數據場景中&#xff0c;文件系統和應用組件的權限管理至關重要。在最新發布的 JuiceFS 社區版 v1.3-Beta 2 中&#xff0c;JuiceFS 引入了與 Apache Ranger 的集成&#xff0c;提供了更為靈活和細粒度的權限控制解決方案。 本文將介紹 JuiceFS 社區版如何與 Apache Ranger…

6月8日day48打卡

隨機函數與廣播機制 知識點回顧&#xff1a; 隨機張量的生成&#xff1a;torch.randn函數卷積和池化的計算公式&#xff08;可以不掌握&#xff0c;會自動計算的&#xff09;pytorch的廣播機制&#xff1a;加法和乘法的廣播機制 ps&#xff1a;numpy運算也有類似的廣播機制&…

計算機常用快捷鍵分類匯總,涵蓋 Windows、macOS 以及通用軟件場景

一、系統通用快捷鍵 功能Windows 快捷鍵macOS 快捷鍵復制Ctrl CCommand C粘貼Ctrl VCommand V剪切Ctrl XCommand X撤銷Ctrl ZCommand Z全選Ctrl ACommand A保存Ctrl SCommand S打印Ctrl PCommand P新建窗口/標簽頁Ctrl NCommand N關閉當前窗口/標簽頁Ctrl WC…

ES6中的Map與Set數據結構的簡單應用

一、Map定義和基本用法 Map是一種鍵值對集合&#xff0c;其中鍵和值都可以是任何類型&#xff08;對象、原始值等&#xff09;。與普通對象不同&#xff0c;Map保持鍵值對的插入順序&#xff0c;并且允許使用任何類型的鍵。 1、創建Map const map new Map()2、添加鍵值對。…

25.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--用戶服務接口

用戶管理是任何系統的基礎功能之一&#xff0c;本篇介紹了如何實現一個完整的用戶管理模塊&#xff0c;包括用戶信息的增刪改查、用戶狀態管理、分頁查詢、數據驗證和權限控制。核心代碼實現部分涵蓋了控制器&#xff08;UserController&#xff09;、服務接口&#xff08;IUse…

基于深度學習的無人機軌跡預測

完整代碼見文末 隨著無人機技術的不斷發展,無人機在農業、物流、監控等領域的應用日益廣泛。精準的軌跡預測不僅能夠提高無人機飛行的效率和安全性,還能在應對復雜環境下的突發狀況時做出迅速反應。因此,基于深度學習的無人機軌跡預測已成為當前研究和應用的熱門方向。 無…

AUTOSAR實戰教程--DoIP_02_診斷鏈路建立流程

第一步&#xff1a;DoIP實體車輛聲明/診斷儀車輛識別請求 打開激活線以后&#xff0c;DoIP實體發的三幀車輛聲明報文。其中包含了DoIP實體的診斷邏輯地址&#xff08;可以類比DoCAN的物理請求/響應地址&#xff09;&#xff0c;對應車輛的VIN碼&#xff08;若已配置&#xff0…

跟我學c++中級篇——多線程中的文件處理

一、文件處理 作為IO處理的一種重要場景&#xff0c;文件處理是幾乎所有編程都無法繞過的一個情況。稍微復雜的一些的程序都可能需要文件處理&#xff0c;不管這種文件處理對開發者來說是顯式的還是隱式的。相對于其它語言&#xff0c;C并未提供多么好的文件處理API接口&#…