“組件協作”模式之策略模式

目錄

  • 策略模式
    • 引例
    • 動機 Motivation
    • 模式定義
    • 結構
    • 要點總結

策略模式

引例

稅務計算系統,根據各個國家的稅法,進行稅務計算。各個國家稅法規定差別很大,需對應進行相應的實現。

  • 常規解耦前寫法
    使用if-else語句或switch-case語句進行結構化分而治之且有增加的擴展變化需求可能,擴展新的需求不方便。
    // 稅務類型 枚舉類型
    enum TaxBase
    {CN_Tax,US_Tax,DE_Tax,// 擴展,更改變化點FR_Tax
    };class SalesOrder
    {TaxBase tax;
    public:double CalculateTax(){...if(tax == CN_Tax){// 中國稅務計算實現...}else if(tax == US_Tax){// 美國稅務計算實現}else if(tax == DE_Tax){// 德國稅務計算實現...}// 增加拓展法國,以下為更改變化點else if(tax = FR_Tax){// 法國稅務計算實現...}			...}
    };
    

以上違背“開閉原則”,即對擴展開發,對更改封閉

  • 策略模式搭配簡單工廠寫法,代碼具有良好的本地性

    // 稅法策略類 —— 基類
    class TaxStrategy
    {
    public:virtual double Calculate(const Context& context) = 0;virtual ~TaxStrategy(){}
    }// 各稅法對應派生類
    class CNTax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 中國稅務計算實現...}
    };class USTax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 美國稅務計算實現...}
    };class DETax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 德國稅務計算實現...}
    };// 擴展變化點
    class FRTax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 法國稅務計算實現...	}
    };// 以下部分穩定
    class SalesOrder
    {
    private:// 多態的變量,一般使用指針TaxStrategy* strategy;
    public:// 工廠模式創建一個具體的稅務策略類SalesOrder(StrateFactory* strateFactory){this->strategy = strategyFactory->NewStrategy();}~SalesOrder(){delete this->strategy;}double CalculateTax(){...Context context();double val = strategy->Calculate(context);	// 多態調用...}
    }
    

動機 Motivation

  • 在軟件構建過程中,某些對象使用的算法可能多種多樣,經常改變,如果將這些算法都編碼到對象中,將會使對象變得異常復雜;有時支持不使用的算法也是一個性能負擔。
  • 策略模式可以在運行時根據需要透明地更改對象的算法,將算法與對象本身解耦

模式定義

定義一系列算法,把它們一個個封裝起來,并且使它們可互相替換(變化)。該模式使得算法可獨立于使用它的客戶程序(穩定)而變化(擴展,子類化)。

結構

在這里插入圖片描述
紅色部分為穩定部分,藍色部分為變化部分。

要點總結

  • Strategy及其子類為組件提供了一系列可重用的算法,從而可以使
    得類型在運行時方便地根據需要在各個算法之間進行切換。
  • Strategy模式提供了用條件判斷語句以外的另一種選擇,消除條件
    判斷語句,就是在解耦合。含有許多條件判斷語句的代碼通常都需
    要Strategy模式。
  • 如果Strategy對象沒有實例變量,那么各個上下文可以共享同一個
    Strategy對象,從而節省對象開銷。

來源:極客班——C++設計模式入門

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

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

相關文章

VS Git巨坑 切換分支失敗導致原分支被修改

VS2013Git 首先當前分支(分支A)的變更已經提交,應該可以正常切換分支。 想切換到一個比較老的分支B(跟當前分支存在較大差異,增加了很多文件),VS中提示切換失敗,當前分支仍然是分支A…

uniapp頁面間通信uni.$on與通過uni.navigateTo中eventChannal的方式的區別

背景。無意間開發uniapp程序用到了頁面跳轉數據傳遞的兩種方式。但各用于什么場景,有什么區別記錄一下。大模型給的內容較多,貼出一些結論。eventChannel文檔鏈接uni.$emit文檔鏈接 頁面跳轉而非全局事件通知,優先選擇eventChanel的方式。 首…

理解對話上下文

1、pom依賴 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><langchain4j.version>…

【Java高頻面試問題】數據庫篇

【Java高頻面試問題】數據庫篇 為什么MySQL選擇B樹作為索引一、B 樹的優勢特性二、與常見數據結構的對比 索引優化一、索引類型及使用場景二、索引優化核心策略1. 避免索引失效場景2. 性能優化實踐3. 表結構與架構優化 三、高頻面試問題參考答案總結&#xff1a;面試核心要點 數…

《Whisper:開啟語音識別新時代的鑰匙》

Whisper 模型:技術革新的基石 在當今科技飛速發展的時代,自動語音識別(ASR)技術作為人工智能領域的關鍵分支,正深刻地改變著人們的生活與工作方式。從智能語音助手到實時字幕生成,從語音交互設備到智能客服系統,ASR 技術無處不在,為人們帶來了前所未有的便利與效率提升…

關于 pdd:anti_content參數分析與逆向

一、逆向目標 目標&#xff1a;獲取pdd商品列表接口數據網址&#xff1a;aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbS9ob21lL2hvbWUv 二、逆向步驟 2.1 anti_content 入口定位 >1 找到需加密參數 >2 全局搜索定位 這里只出來一個結果&#xff0c;很明顯&#xff0c;點進去。 …

限流系列之五:TDMQ RabbitMQ Serverless 版限流機制深度解析與實踐指南

導語 分布式集群限流是保障云服務高可用性的核心技術手段&#xff0c;其意義不僅在于防止系統過載&#xff0c;更是構建彈性架構、優化資源效率、實現業務可持續性的關鍵策略。未來&#xff0c;隨著邊緣計算和 Serverless 的普及&#xff0c;限流技術將進一步與底層基礎設施深…

官方鏈接內容整理的 Spark-TTS Windows 安裝完整流程

官方鏈接內容整理的 Spark-TTS Windows 語音克隆 安裝完整流程 官方鏈接內容整理的 Spark-TTS Windows 安裝完整流程&#xff1a; Spark TTS&#xff1a;基于大型語言模型的文本轉語音模型 Spark-TTS 是一個先進的文本轉語音系統&#xff0c;利用大型語言模型&#xff08;LLM…

Spring Cloud Config動態刷新實戰指南

以下是利用 Spring Cloud Config + Bus 實現配置動態刷新的完整步驟和原理說明: 一、核心原理 消息總線機制 Bus 通過消息代理(如 RabbitMQ/Kafka)建立公共 Topic(默認 springCloudBus),當配置變更時,任一服務觸發刷新請求,消息會廣播至所有監聽該 Topic 的服務實例,實…

Linux 修改密碼教程

Linux 修改密碼教程 Linux 系統中修改密碼是非常常見的管理操作&#xff0c;無論是修改當前用戶密碼還是其他用戶的密碼&#xff0c;通常都可以通過終端完成。本文將詳細介紹如何在 Linux 系統中修改密碼&#xff0c;并包括修改其他用戶密碼的方法。 1. 修改當前用戶密碼 修改…

正則表達式詳解:從基礎到高級應用的全面指南

文章大綱 引言&#xff1a;什么是正則表達式&#xff1f; 在編程和文本處理領域&#xff0c;正則表達式&#xff08;Regular Expression&#xff0c;簡稱 regex&#xff09;是一種強大的工具&#xff0c;用于描述和匹配文本中的特定模式。它本質上是一種由字符和特殊符號組成…

flutter結合ai工具(其他語言通用)

一、為什么Flutter開發者需要免費AI工具&#xff1f; 1. 減少重復性編碼 Flutter開發中&#xff0c;UI組件、網絡請求、狀態管理等代碼高度重復&#xff0c;AI可自動生成這些代碼。 示例&#xff1a;輸入"創建一個Material Design風格的登錄頁面"&#xff0c;AI工具…

鴻蒙容器組件 Row 全解析:水平布局技術與多端適配指南

一、引言&#xff1a;Row 組件 —— 水平布局的核心引擎 在鴻蒙全場景應用開發中&#xff0c;Row 容器組件作為水平布局的標準載體&#xff0c;通過聲明式語法實現子組件的有序水平排列。作為線性布局體系的重要組成部分&#xff0c;其簡潔的屬性體系與強大的適配能力&#xf…

基于 PCIe 架構的處理器系統

處理器系統A 在有些處理器系統中&#xff0c;沒有直接提供PCI總線&#xff0c;此時需要使用PCIe橋&#xff0c;將PCIe鏈路轉換為PCI總線之后&#xff0c;才能連接PCI設備 在這種結構中&#xff0c;RC由兩個FSB-to-PCIe橋和存儲器控制器組成。 FSB是Front Side Bus的縮寫&…

Qt 與 Halcon 聯合開發五:為何與如何將耗時算法移入子線程

在 Qt 應用程序開發中&#xff0c;界面響應速度直接影響用戶體驗。而在集成圖像處理庫如 Halcon 的項目中&#xff0c;耗時算法一旦運行于主線程中&#xff0c;極易造成界面卡頓甚至假死。本篇文章將圍繞耗時算法必須移入子線程執行這一核心原則&#xff0c;結合 Qt 與 Halcon …

聚焦OpenVINO與OpenCV顏色通道轉換的實踐指南

顏色通道順序問題&#xff1a;OpenVINO模型RGB輸入與OpenCV BGR格式的轉換 在計算機視覺任務中&#xff0c;框架間的顏色通道差異常導致模型推理錯誤。以下方法解決OpenVINO模型需要RGB輸入而OpenCV默認輸出BGR的問題。 理解核心差異 OpenCV的imread()函數遵循BGR通道順序&a…

【軟考高級系統架構論文】論企業集成平臺的理解與應用

論文真題 企業集成平臺 (Enterprise Integration Platform, EIP) 是支持企業信息集成的環境,其主要功能是為企業中的數據、系統和應用等多種對象的協同運行提供各種公共服務及運行時的支撐環境。企業集成平臺能夠根據業務模型的變化快速地進行信息系統的配置和調整,保證不同…

LabVIEW光譜儀設計

采用LabVIEW 開發平臺&#xff0c;搭配品牌硬件構建光譜儀系統&#xff0c;實現光譜數據的高效采集、分析與顯示&#xff0c;展現 LabVIEW 在儀器開發中的快速集成與靈活擴展能力。 ? 應用場景 科研領域&#xff1a;用于材料光譜特性研究、光學實驗數據分析&#xff0c;支持高…

Nginx配置文件介紹和基本使用

Nginx配置文件介紹和基本使用 Nginx 是一款高性能的 HTTP 服務器、反向代理服務器及電子郵件代理服務器&#xff0c;由俄羅斯工程師 Igor Sysoev 開發&#xff0c;并于2004年首次公開發布。以輕量級、高并發能力、穩定性和低資源消耗著稱。 主要功能 HTTP服務器&#xff1a;…

DataSophon 1.2.1集成Flink 1.20并增加JMX 監控

參考:datasophon集成Flink1.20.0 此大神有多篇集成其他服務的文章&#xff0c;建議關注一波 一、服務集成 flink 1.20 下載 1.構建壓縮包&#xff1a; 1.1拷貝需要的包 tar -zxvf flink-1.20.0-bin-scala_2.12.tgz tar czf flink-1.20.0.tar.gz flink-1.20.0# 為了flink cdc…