Python10天沖刺-設計模型之策略模式

策略模式是一種行為設計模式,它允許你在運行時動態地改變對象的行為。這種模式的核心思想是將一組相關的算法封裝在一起,并讓它們相互替換。

下面是使用 Python 實現策略模式的一個示例:

示例代碼

假設我們有一個簡單的購物車系統,其中不同的支付方式有不同的折扣策略。我們將使用策略模式來實現這一功能。

1. 定義抽象基類(策略接口)
from abc import ABC, abstractmethodclass PaymentStrategy(ABC):@abstractmethoddef pay(self, amount):pass
2. 具體策略實現
class CreditCardPayment(PaymentStrategy):def pay(self, amount):print(f"Paying ${amount} with credit card.")return f"${amount} paid using credit card."class PayPalPayment(PaymentStrategy):def pay(self, amount):print(f"Paying ${amount} with PayPal.")return f"${amount} paid using PayPal."
3. 上下文類

上下文類負責使用具體的策略來進行支付。

class ShoppingCart:def __init__(self, payment_strategy: PaymentStrategy):self._items = []self.payment_strategy = payment_strategydef add_item(self, item):self._items.append(item)def calculate_total(self):return sum(item['price'] for item in self._items)def checkout(self):total_amount = self.calculate_total()return self.payment_strategy.pay(total_amount)
4. 測試策略模式
if __name__ == "__main__":cart = ShoppingCart(CreditCardPayment())cart.add_item({'name': 'Shirt', 'price': 20})cart.add_item({'name': 'Pants', 'price': 30})print(cart.checkout())cart = ShoppingCart(PayPalPayment())cart.add_item({'name': 'Shoes', 'price': 50})cart.add_item({'name': 'Hat', 'price': 15})print(cart.checkout())

解釋

  1. 抽象基類(策略接口)

    • PaymentStrategy 類定義了一個抽象方法 pay,這是所有具體策略必須實現的方法。
  2. 具體策略實現

    • CreditCardPaymentPayPalPayment 分別實現了 pay 方法,提供了不同的支付邏輯。
  3. 上下文類

    • ShoppingCart 類持有一個 payment_strategy 屬性,用于存放具體的支付策略。
    • checkout 方法計算總金額并調用當前策略的 pay 方法。
  4. 測試策略模式

    • 創建兩個 ShoppingCart 對象,分別使用 CreditCardPaymentPayPalPayment 策略。
    • 添加商品并結算,觀察不同支付策略的結果。

通過這種方式,你可以靈活地切換不同的支付策略,而無需修改上下文類的代碼。這就是策略模式的主要優點之一。


完整可運行的代碼庫

from abc import ABC, abstractmethod# 抽象基類(策略接口)
class PaymentStrategy(ABC):@abstractmethoddef pay(self, amount):pass# 具體策略實現
class CreditCardPayment(PaymentStrategy):def pay(self, amount):print(f"Paying {amount} using credit card.")return f"{amount} paid using credit card."class PayPalPayment(PaymentStrategy):def pay(self, amount):print(f"Paying {amount} using PayPal.")return f"{amount} paid using PayPal."# 上下文類
class ShoppingCart:def __init__(self, payment_strategy: PaymentStrategy):self.items = []self.payment_strategy = payment_strategydef add_item(self, item):self.items.append(item)def remove_item(self, item):self.items.remove(item)def calculate_total(self):return sum(item['price'] for item in self.items)def checkout(self):total_amount = self.calculate_total()return self.payment_strategy.pay(total_amount)if __name__ == "__main__":cart = ShoppingCart(CreditCardPayment())cart.add_item({'name': 'Shirt', 'price': 20})cart.add_item({'name': 'Pants', 'price': 30})print(cart.checkout())cart = ShoppingCart(PayPalPayment())cart.add_item({'name': 'Shoes', 'price': 50})cart.add_item({'name': 'Hat', 'price': 15})print(cart.checkout())```

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

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

相關文章

【CTFer成長之路】XSS的魔力

XSS闖關 level1 訪問url: http://c884a553-d874-4514-9c32-c19c7d7b6e1c.node3.buuoj.cn/level1?usernamexss 因為是xss,所以對傳參進行測試,修改?username1,進行訪問 會發現username參數傳入什么,welcome之后就…

自主機器人模擬系統

一、系統概述 本代碼實現了一個基于Pygame的2D自主機器人模擬系統,具備以下核心功能: 雙模式控制:支持手動控制(WASD鍵)和自動導航模式(鼠標左鍵設定目標) 智能路徑規劃:采用改進型…

快速上手非關系型數據庫-MongoDB

簡介 MongoDB 是一個基于文檔的 NoSQL 數據庫,由 MongoDB Inc. 開發。 NoSQL,指的是非關系型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同于傳統的關系型數據庫的數據庫管理系統的統稱。 MongoDB 的設計理念是為了應對大數據量、…

性能優化實踐:啟動優化方案

性能優化實踐:啟動優化方案 在Flutter應用開發中,啟動性能是用戶體驗的第一印象,也是應用性能優化的重要環節。本文將從理論到實踐,深入探討Flutter應用的啟動優化方案。 一、Flutter應用啟動流程分析 1. 啟動類型 冷啟動&…

在文本廢墟中打撈月光

在文本廢墟中打撈月光 ----再讀三三的《山頂上是海》之“暗室”所理 今天是2025年5月1日,傳統的“五一”小長假。當我早飯后“坐”在衛生間的那幾分鐘里,閨女和兒子就騎著家中僅有的兩輛電動車去了圖書館。我是該做些什么? 于是我左手拿著三…

C++之類和對象基礎

?向對象三?特性:封裝、繼承、多態 類和對象 一.類的定義1. 類的定義格式2.類域 二.實例化1.對象2.對象的大小 三.this指針 在 C 的世界里,類和對象構成了面向對象編程(Object-Oriented Programming,OOP)的核心框架&…

計算機網絡——HTTP/IP 協議通俗入門詳解

HTTP/IP 協議通俗入門詳解 一、什么是 HTTP 協議?1. 基本定義2. HTTP 是怎么工作的? 二、HTTP 協議的特點三、HTTPS 是什么?它和 HTTP 有啥區別?1. HTTPS 概述2. HTTP vs HTTPS 四、HTTP 的通信過程步驟詳解: 五、常見…

使用 Java 實現一個簡單且高效的任務調度框架

目錄 一、任務調度系統概述 (一)任務調度的目標 (二)任務調度框架的關鍵組成 二、任務狀態設計 (一)任務狀態流轉設計 (二)任務表設計(SQL) 三、單機任…

基于GPT 模板開發智能寫作輔助應用

目錄 項目說明 1. 項目背景 2. 項目目標 3. 功能需求 4. 技術選型 項目結構 詳細代碼實現 前端代碼(client) client/src/main.js client/src/App.vue client/src/components/HistoryList.vue 后端代碼(server) server/app.js server/routes/api.js server/mo…

linux 使用nginx部署next.js項目,并使用pm2守護進程

前言 本文基于:操作系統 CentOS Stream 8 使用工具:Xshell8、Xftp8 服務器基礎環境: node - 請查看 linux安裝node并全局可用pm2 - 請查看 linux安裝pm2并全局可用nginx - 請查看 linux 使用nginx部署vue、react項目 所需服務器基礎環境&…

使用huggingface_hub需要注意的事項

在安裝huggingface_hub的時候要注意如果你的python是放在c盤下時記得用管理員模式命令行來安裝huggingface_hub,否則安裝過程會報錯,之后也不會有huggingface-cli命令。 如果安裝時因為沒有用管理員權限安裝而報錯了,可以先卸載huggingface-…

Spring MVC @RequestHeader 注解怎么用?

我們來詳細解釋一下 Spring MVC 中的 RequestHeader 注解。 RequestHeader 注解的作用 RequestHeader 注解用于將 HTTP 請求中的**請求頭(Request Headers)**的值綁定到 Controller 方法的參數上。 請求頭是 HTTP 請求的一部分,包含了關于…

Rust 學習筆記:關于結構體的例題

Rust 學習筆記:關于結構體的例題 Rust 學習筆記:關于結構體的例題下面的程序能通過編譯嗎?下面的程序能通過編譯嗎?下面的程序能通過編譯嗎?哪種說法最能描述 Display 和 Debug 特質之間的區別?下面哪個選項…

STM32 SPI通信協議

1. SPI協議概述 1.1 什么是SPI? SPI(Serial Peripheral Interface)是由摩托羅拉公司于1980年代提出的同步串行通信協議,主要用于短距離高速芯片間通信。作為四線制全雙工通信協議,它以簡單的硬件實現和高效的傳輸速率…

92.一個簡單的輸入與顯示示例 Maui例子 C#例子

一、關于項目命名的注意事項 在開發.NET MAUI項目時,項目命名是一個不可忽視的細節。如果你習慣了在C#控制臺或WPF項目中使用中文項目名稱,那么在.NET MAUI中,你可能會遇到一些問題。我之前就因為使用中文項目名稱而導致項目無法直接運行&am…

Locate 3D:Meta出品自監督學習3D定位方法

標題: Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要: 我們提出了 Locate 3D,這是一種可根據指代表達(如“沙發和燈之間的小咖啡桌”)在三維場景中定位物體的模型。Locate 3…

FastAPI 與數據庫交互示例

目錄 安裝必要的包完整代碼示例運行應用使用說明API 端點說明代碼解析 下面將創建一個簡單的 FastAPI 應用程序,演示如何與 SQLite 數據庫進行交互。這個例子包括創建、讀取、更新和刪除(CRUD)操作。 安裝必要的包 首先,需要安裝…

YOLO旋轉目標檢測之ONNX模型推理

YOLO旋轉檢測相較于目標檢測而言,其只是最后的輸出層網絡發生了改變,一個最明顯的區別便是:目標檢測的檢測框是xywh,而旋轉檢測則為xywha,其中,這個a代表angle,即旋轉角度,其余的基本…

架構進階:深入學習企業總體架構規劃(Oracle 戰略專家培訓課件)【附全文閱讀】

本文主要討論了企業總體技術架構規劃的重要性與實施建議。針對Oracle戰略專家培訓課件中的內容,文章強調了行業面臨的挑戰及現狀分析、總體技術架構探討、SOA集成解決方案討論與問題解答等方面。文章指出,為了消除信息孤島、強化應用系統,需要…

llamafactory-cli webui啟動報錯TypeError: argument of type ‘bool‘ is not iterable

一、問題 在阿里云NoteBook上啟動llamafactory-cli webui報錯TypeError: argument of type ‘bool’ is not iterable This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run gradio deploy from the terminal in the working directory t…