【Python筆記-設計模式】策略模式

一、說明

策略模式是一種行為設計模式,它定義了一系列算法,將每個算法封裝起來,并使它們可以互相替換。

(一) 解決問題

在需要根據不同情況選擇不同算法或策略,規避不斷開發新需求后,代碼變得非常臃腫難以維護管理。

(二) 使用場景

  • 當一個類有多個行為,而且這些行為在不同的情況下有不同的實現時
  • 當需要在運行時動態地選擇算法時
  • 當一個類的一部分行為是固定的,一部分是可變的時,可以使用策略模式來封裝可變的部分

二、結構

  1. 上下文(Context)維護指向具體策略的引用,且僅通過策略接口與該對象進行交流。
  2. 策略(Strategy)接口是所有具體策略的通用接口,它聲明了一個上下文用于執行策略的方法。
  3. 具體策略(ConcreteStrategies)實現了上下文所用算法的各種不同變體。
  4. 當上下文需要運行算法時,它會在其已連接的策略對象上調用執行方法。上下文不清楚其所涉及的策略類型與算法的執行方式。
  5. 客戶端(Client)會創建一個特定策略對象并將其傳遞給上下文。上下文則會提供一個設置器以便客戶端在運行時替換相關聯的策略。

三、偽代碼

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
策略模式例:商場優惠活動,選擇不同的優惠策略,最后計算的價格也不同。而如果增加新算法,只需增加一個策略類,無需修改現有代碼
"""from abc import ABC, abstractmethodclass DiscountStrategy(ABC):"""抽象策略類"""@abstractmethoddef apply_discount(self, price):passclass PercentDiscount(DiscountStrategy):"""具體策略類:打折策略"""def __init__(self, discount_percent):self.discount_percent = discount_percentdef apply_discount(self, price):return price * (1 - self.discount_percent / 100)class FullReduction(DiscountStrategy):"""具體策略類:滿減策略"""def __init__(self, full_price, reduction_price):self.full_price = full_priceself.reduction_price = reduction_pricedef apply_discount(self, price):return price - (price // self.full_price) * self.reduction_priceclass Promotion:"""上下文類:商場促銷"""def __init__(self, discount_strategy):self.discount_strategy = discount_strategydef apply_discount(self, price):return self.discount_strategy.apply_discount(price)if __name__ == "__main__":"""打折后價格:80.0滿減后價格:100"""# 商品原價original_price = 100# 選擇打折策略,打8折promotion = Promotion(PercentDiscount(20))discounted_price = promotion.apply_discount(original_price)print(f"打折后價格:{discounted_price}")# 選擇滿減策略,滿200減50promotion = Promotion(FullReduction(200, 50))discounted_price = promotion.apply_discount(original_price)print(f"滿減后價格:{discounted_price}")

四、優缺點

優點

  • 靈活性和可擴展性:策略模式將算法封裝成獨立的類,使得可以獨立地添加、修改或替換算法,而不影響到客戶端的代碼,從而提高了代碼的靈活性和可擴展性。
  • 易于維護:由于算法被封裝在獨立的類中,使得每個算法都有自己的類,易于理解和維護。
  • 避免條件語句的使用:策略模式避免了使用大量的條件語句來選擇不同的算法,使得代碼更加清晰和易于理解。
  • 符合開閉原則:策略模式符合開閉原則,即對擴展開放,對修改關閉,可以通過添加新的策略類來擴展功能,而不需要修改現有的代碼。

缺點

  • 增加了類的數量:每個具體策略都需要一個對應的策略類,可能會增加類的數量。
  • 客戶端必須知道所有的策略類:客戶端必須知道所有的策略類,并且在使用時需要顯式地選擇合適的策略類,這可能會增加客戶端的復雜性。
  • 如果算法極少發生改變,那么沒有任何理由引入新的類和接口。使用該模式只會讓程序過于復雜。

【Python筆記】設計模式-CSDN博客

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

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

相關文章

如何將圖片保存成視頻(imageio、opencv和ffmpeg)

測試下來發現,imageio 速度比 cv2 的要慢,所以普通保存推薦 cv2,要gpu加速需要額外配置或者修改 imageio 底層也是調用的ffmpeg,以下是python代碼 import imageio import os# 讀取要保存為視頻的圖片 images [] for filename …

UE 打包窗口及鼠標狀態設置

UE 打包窗口及鼠標狀態設置 打包后鼠標不鎖定 顯示鼠標圖標 打包后設置窗口模式 找到打包路徑下的配置文件GameUserSettings,設置相關項目 FullscreenMode0表示全屏模式,1表示窗口全屏模式,2表示窗口模式

模型部署 - BevFusion - (1) - 思路總結

模型部署實踐 - BevFusion 思路總結一、網絡結構 - 總結1.1、代碼1.2、網絡流程圖1.3、模塊大致梳理 二、Onnx 的導出 -總體思路分析三、優化思路總結 學習 BevFusion 的部署,看了很多的資料,這篇博客進行總結和記錄自己的實踐 思路總結 對于一個模型我…

【代碼】Android|獲取壓力傳感器、屏幕壓感數據(大氣壓、原生和Processing)

首先需要分清自己需要的是大氣壓還是觸摸壓力,如果是大氣壓那么就是TYPE_PRESSURE,可以參考https://source.android.google.cn/docs/core/interaction/sensors/sensor-types?hlzh-cn。如果是觸摸壓力就是另一回事,我需要的是觸摸壓力。 不過…

軟考 系統分析師系列知識點之系統分析的任務、難點與要求(1)

所屬章節: 第10章. 系統分析 第1節. 系統分析概述 系統分析階段也稱為邏輯設計階段,其任務是根據系統設計書所確定的范圍,對現有系統進行詳細設計調查,描述現有系統的業務流程,指出現有系統的局限性和不足之處&#x…

Qt+libhv實現各類網絡通信方式(TCP-UDP-HTTP-WebSocket)

文章目錄 TCP通信服務端客戶端UDP通信服務端客戶端HTTP通信服務端客戶端WebSocket通信服務端客戶端參考項目下載為了實現程序的跨進程和跨主機通信,我們通常會采用網絡通信進行數據傳輸。常用的通信方式包括TCP/UDP、HTTP、WebSocket等,這些網絡通信方式各有優劣有的是短連接…

事故預測 | Matlab基于FuzzySVR模糊支持向量機多特征變量事故預測

事故預測 | Matlab基于FuzzySVR模糊支持向量機多特征變量事故預測 目錄 事故預測 | Matlab基于FuzzySVR模糊支持向量機多特征變量事故預測預測效果基本描述程序設計參考資料 預測效果 基本描述 Matlab基于FuzzySVR模糊支持向量機多特征變量事故預測 運行環境: Matlab2023及以 上…

C++經典日期類實現

學完C類和對象以及四個默認成員函數&#xff0c;就可以來嘗試自己實現一下日期類。完成日期類的各種功能&#xff0c;并加強自己的代碼能力。 日期類實現 定義一個日期類 // 文件:Date.h #pragma once #include <iostream> using std::cout; using std::endl;//定義日…

C語言數組作為函數參數

有兩種情形&#xff1b; 一種是數組元素作為函數實參&#xff1b;一種是數組名作為函數參數&#xff1b; 新建一個VC6單文檔工程&#xff1b; void printshz(int , CDC* , int , int ); double getav(int a[5]); ...... void CShzcshView::OnDraw(CDC* pDC) {CShzcshDoc* pDo…

Pthon圖像處理Opencv初步:色彩轉換、打開攝像頭

文章目錄 處理流程顏色空間二值圖像攝像頭 python圖像處理教程&#xff1a;初步&#x1f4f7;插值變換&#x1f4f7;形態學處理&#x1f4f7;濾波 處理流程 opencv是跨平臺圖像處理庫&#xff0c;為許多編程語言提供了接口&#xff0c;Python自然在列&#xff0c;但在使用pip…

32單片機基礎:PWM驅動舵機,直流電機

PWM驅動舵機 接線圖如上圖所示。注意&#xff0c;舵機的5V 線不能接到面包板上的正極&#xff0c;面包板上的正極只有3.3V,是STM32提供的&#xff0c;所以要接到STLINK的5V, 我們如何驅動舵機呢&#xff1f;由之前我們介紹原理知道&#xff0c;要輸出如下圖對應的PWM波形才行…

AWTK 開源串口屏開發(11) - 天氣預報

# AWTK 開源串口屏開發 - 天氣預報 天氣預報是一個很常用的功能&#xff0c;在很多設備上都有這個功能。實現天氣預報的功能&#xff0c;不能說很難但是也絕不簡單&#xff0c;首先需要從網上獲取數據&#xff0c;再解析數據&#xff0c;最后更新到界面上。 在 AWTK 串口屏中…

數字革命的浪潮:Web3如何改變一切

隨著數字技術的不斷發展&#xff0c;人類社會正迎來一場前所未有的數字革命浪潮。在這個浪潮中&#xff0c;Web3技術以其去中心化、安全、透明的特性&#xff0c;正在逐漸改變著我們的生活方式、商業模式以及社會結構。本文將深入探討Web3技術如何改變一切&#xff0c;以及其所…

volatile關鍵字的作用 以及 單例模式(餓漢模式與懶漢模式的區別及改進)

文章目錄 &#x1f4a1;volatile保證內存可見性&#x1f4a1;單例模式&#x1f4a1;餓漢模式&#x1f4a1;懶漢模式&#x1f4a1;懶漢模式多線程版&#x1f4a1;volatile防止指令重排序 &#x1f4a1;volatile保證內存可見性 Volatile 修飾的變量能夠保證“內存可見性”以及防…

解決連接工具Mobaxterm連接錯誤Connection timed out----VMware里Linux端口號固定

錯誤&#xff1a;Connection timed out 原因&#xff1a; 沒有固定ip&#xff0c;網絡斷開&#xff0c;再次連接就是新的IP 解決&#xff1a; 再次測試連接&#xff0c;彈出這個就代表成功了

CUDA 中的線程組織

明朝那些事中有一句話&#xff1a;我之所以寫徐霞客是想告訴你&#xff0c;所謂千秋霸業萬古流芳&#xff0c;與一件事相比&#xff0c;其實都算不了什么&#xff0c;這件事情就是——用你喜歡的方式度過一生。 我們以最簡單的 CUDA 程序&#xff1a;從 GPU 中輸出 Hello World…

實現一個簡單的哈希映射功能

說在前面 &#x1f388;哈希表大家應該都經常用到吧&#xff0c;那么大家有沒有想過哈希表是怎么實現的呢&#xff1f;今天讓我們一起從一道簡單的題目來初步了解一個哈希表的簡單原理。 目的 不使用任何內建的哈希表庫設計一個哈希映射&#xff08;HashMap&#xff09;。 實…

bert 相似度任務訓練完整版

任務 之前寫了一個相似度任務的版本&#xff1a;bert 相似度任務訓練簡單版本,faiss 尋找相似 topk-CSDN博客 相似度用的是 0&#xff0c;1&#xff0c;相當于分類任務&#xff0c;現在我們相似度有評分&#xff0c;不再是 0,1 了&#xff0c;分數為 0-5&#xff0c;數字越大…

EasyRecovery易恢復2024免費文件數據恢復軟件下載

一、軟件概述 EasyRecovery易恢復中文文件數據恢復軟件是一款專為中文用戶設計的強大數據恢復工具。該軟件致力于幫助用戶從各種存儲設備中恢復因各種原因丟失的中文文件&#xff0c;如文檔、圖片、視頻、音頻等。憑借其核心技術和多年的研發經驗&#xff0c;EasyRecovery易恢…

C語言計算誤碼率

#include <stdio.h> #include <stdlib.h> bool dayintrue; //是否打印 int main(){ int i,k,g0; int n10,n20; int good0,bad0; double rate; (dayin)? printf("打印具體數據\n"):printf("不打印具體數據\n\n");…