行為模式---策略模式

概念

策略模式是一種行為設計摸是,它的核心思想是將一些列的算法封裝成獨立的對象,并使它們可以相互替換,通過上下文進行調用。

策略模式通過算法抽象為獨立的策略類,客戶端可以根據自身需求選擇不同的策略類來完成任務、這種方式使得算法的變化不會影響客戶端代碼。

適用場景

1、當使用對象使用一系列不同的算法,并在運行的時候需要進行動態切換,可以使用策略模式。

2、當有許多的僅在執行的時候一些行為不同,但是這些行為卻有些類似的時候就可以使用策略模式。

3、隔離算法和業務邏輯,如果算法的邏輯在上下文中不是很重要,那么就可以使用策略模式將算法封裝,實現算法和業務邏輯的隔離。

4、當使用了一系列同一算法的不同變體的時候,需要復雜的條件判斷來執行對應的算法的時候,可以使用策略模式。減少業務邏輯的復雜度。

創建方式

1、策略模式需要創建立兩個接口,一個是算法接口類,一個是上下文接口。

2、創建算法接口類,需要定義一個算法函數。

3、創建一個上下文接口,需要實現一個算法的引用對象,和一個是設置算法對象的函數,算法執行函數。

4、實現具體的事算法類,繼承算法接口類,實現具體的算法實現。

5、實現具體的上下類,繼承上下接口。實現接口中的函數。在實現定調用的函數的時候通過算法對象的引用調用算法函數。

6、在客戶端使用的時候,先創建算法對象,之后創建上下文對象,在創建上下文對象的時候可以通過構造函數或者設置算法對象的函數將算法對象設置給上下文對象。之后調用上下文函數即可。

類關系圖

在這里插入圖片描述

示例代碼

#include "CeLueMoShi.h"
int main()
{std::cout << "歡迎東哥來到設計模式的世界!\n";//創建策略類對象AlgorithmBase* add = new AddAlgorithm();AlgorithmBase* sub = new SubAlgorithm();AlgorithmBase* mul = new MulAlgorithm();//創建上下文類CeContext context;context.setAlgorith(add);int ret = context.callAlgorithm(5, 5);cout << "add : ret = " << ret << endl;context.setAlgorith(sub);ret = context.callAlgorithm(5, 5);cout << "sub : ret = " << ret << endl;context.setAlgorith(mul);ret = context.callAlgorithm(5, 5);cout << "mul : ret = " << ret << endl;
}
#pragma once//算法接口類
class AlgorithmBase
{
public:AlgorithmBase() {}~AlgorithmBase() {}virtual int algorithm(int a, int b) { return 0; }
};//具體算法類 + 
class AddAlgorithm : public AlgorithmBase {
public:AddAlgorithm() {}~AddAlgorithm() {}int algorithm(int a, int b) {return a + b;}};//具體算法類 - 
class SubAlgorithm : public AlgorithmBase {
public:SubAlgorithm() {}~SubAlgorithm() {}int algorithm(int a, int b) {return a - b;}};//具體算法類 * 
class MulAlgorithm : public AlgorithmBase {
public:MulAlgorithm() {}~MulAlgorithm() {}int algorithm(int a, int b) {return a * b;}};//上下文類,此處省略接口類
class CeContext {
public:CeContext() {}~CeContext() {}void setAlgorith(AlgorithmBase* alg) {m_alg = alg;}int callAlgorithm(int a,int b) {int ret = 0;if (m_alg) {ret = m_alg->algorithm(a, b);}return ret;}
private:AlgorithmBase* m_alg = nullptr;
};
歡迎東哥來到設計模式的世界!
add : ret = 10
sub : ret = 0
mul : ret = 25

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

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

相關文章

Selenium 自動化測試學習總結

大概了解一下即可&#xff0c;現在主要用的自動化工具是 playWright&#xff0c;它可以錄制操作。 selenium是老款自動化測試工具&#xff0c;仍有很多可取之處。 安裝&#xff1a; pip install selenium即可。然后下載瀏覽器的驅動包&#xff0c;注意不是瀏覽器&#xff01;…

四層協議攻防手冊:從SYN Flood到UDP反射的深度防御

一、四層協議攻擊類型與特征 攻擊類型協議層特征SYN FloodTCP大量半開連接&#xff0c;SYN_RECV狀態堆積UDP反射放大UDP小請求包觸發大響應&#xff08;如NTP、DNS響應&#xff09;TCP分片攻擊TCP發送異常分片耗盡重組資源連接耗盡攻擊TCP建立大量空閑連接占用端口資源 二、TC…

【社區投稿】深入再談智能指針、AsRef引用與Borrow借用

深入再談智能指針、AsRef引用與Borrow借用 這是一個具有深度的技術主題。每次重溫其理論知識&#xff0c;都會有新的領悟。大約 2 年前&#xff0c;我曾就這一技術方向撰寫過另一篇短文《從類型轉換視角&#xff0c;淺談Deref<Target T>, AsRef<T>, Borrow<T&g…

外層元素旋轉,其包括在內的子元素一并旋轉(不改變旋轉中心),單元測試

思路&#xff1a;外層旋轉后坐標&#xff0c;元素旋轉后坐標&#xff0c;計算偏移坐標 <template><div class"outbox"><label>角度: <input v-model.number"rotate" type"number" /></label><br><div c…

如何在虛擬機上安裝hadoop

與前面java的方式相同安裝好hadoop后進入hadoop的環境變量my_env.sh 輸入#?HADOOP_export HADOOP_HOME /opt/module/hadoop-3.1.3 export PATH$PATH:$HADOOP_HOME/bin export PATH$PATH:$HADOOP_HOME/sbin 再輸入hadoop測試是否安裝成功

WPF-DataGrid的增刪查改

背景&#xff1a;該功能為幾乎所有系統開發都需要使用的功能&#xff0c;現提供簡單的案例。 1、MyCommand using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace Wp…

Oracle數據庫存儲結構--物理存儲結構

數據庫存儲結構&#xff1a;分為物理存儲結構和邏輯存儲結構。 物理存儲結構&#xff1a;操作系統層面如何組織和管理數據 邏輯存儲結構&#xff1a;Oracle數據庫內部數據組織和管理數據&#xff0c;數據庫管理系統層面如何組織和管理數據 存儲結構 在Oracle數據庫的存儲結構…

歌詞相關實現

歌詞相關 歌詞數據模型&#xff1a; // Lyric.swift class Lyric: BaseModel {/// 是否是精確到字的歌詞var isAccurate:Bool false/// 所有的歌詞var datum:Array<LyricLine>! }// LyricLine.swift class LyricLine: BaseModel {/// 整行歌詞var data:String!/// 開始…

紡織服裝制造行業現狀 內檢實驗室系統在紡織服裝制造行業的應用

在紡織服裝制造行業&#xff0c;內檢實驗室LIMS系統&#xff08;實驗室信息管理系統&#xff09;已成為提升檢測效率、優化質量控制和滿足行業合規性要求的關鍵工具。隨著行業競爭的加劇和消費者對產品質量要求的提高&#xff0c;紡織服裝制造企業需要更加高效、準確的檢測流程…

K8s 1.27.1 實戰系列(十一)ConfigMap

ConfigMap 是 Kubernetes 中管理非敏感配置的核心資源,通過解耦應用與配置實現靈活性和可維護性。 一、ConfigMap 的核心功能及優勢 ?1、配置解耦 將配置文件(如數據庫地址、日志級別)與容器鏡像分離,支持動態更新而無需重建鏡像。 ?2、多形式注入 ?環境變量:將鍵值…

3分鐘復現 Manus 超強開源項目 OpenManus

文章目錄 前言什么是 OpenManus構建方式環境準備克隆代碼倉庫安裝依賴配置 LLM API運行 OpenManus 效果演示總結個人簡介 前言 近期人工智能領域迎來了一位備受矚目的新星——Manus。Manus 能夠獨立執行復雜的現實任務&#xff0c;無需人工干預。由于限制原因大部分人無法體驗…

從零開始學機器學習——構建一個推薦web應用

首先給大家介紹一個很好用的學習地址:https://cloudstudio.net/columns 今天,我們終于將分類器這一章節學習完活了,和回歸一樣,最后一章節用來構建web應用程序,我們會回顧之前所學的知識點,并新增一個web應用用來讓模型和用戶交互。所以今天的主題是美食推薦。 美食推薦…

【最后203篇系列】014 AI機器人-1

說明 終于開張了&#xff0c;我覺得AI機器人是一件真正正確&#xff0c;具有商業價值的事。 把AI機器人當成一筆生意&#xff0c;我如何做好這筆生意&#xff1f;一端是業務價值&#xff0c;另一端是技術支撐。如何構造高質量的內容和服務&#xff0c;如何確保技術的廣度和深度…

【大模型統一集成項目】如何封裝多個大模型 API 調用

&#x1f31f; 在這系列文章中&#xff0c;我們將一起探索如何搭建一個支持大模型集成項目 NexLM 的開發過程&#xff0c;從 架構設計 到 代碼實戰&#xff0c;逐步搭建一個支持 多種大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成與管理平臺&#xff…

AI4CODE】3 Trae 錘一個貪吃蛇的小游戲

【AI4CODE】目錄 【AI4CODE】1 Trae CN 錐安裝配置與遷移 【AI4CODE】2 Trae 錘一個 To-Do-List 這次還是采用 HTML/CSS/JAVASCRIPT 技術棧 Trae 錘一個貪吃蛇的小游戲。 1 環境準備 創建一個 Snake 的子文件夾&#xff0c;清除以前的會話記錄。 2 開始構建 2.1 輸入會…

【簡答題002】Java變量簡答題

博主會經常補充完善這里面問題的答案。希望可以得到大家的一鍵三連支持&#xff0c;你的鼓勵是我堅持下去的最大動力&#xff01;謝謝&#xff01; 001 什么是Java變量&#xff1f; Java變量是用來存儲數據并在程序中引用的命名空間。 002 Java變量有哪些類型&#xff1f; J…

從零開發Chrome廣告攔截插件:開發、打包到發布全攻略

從零開發Chrome廣告攔截插件&#xff1a;開發、打包到發布全攻略 想打造一個屬于自己的Chrome插件&#xff0c;既能攔截煩人的廣告&#xff0c;又能優雅地發布到Chrome Web Store&#xff1f;別擔心&#xff0c;這篇教程將帶你從零開始&#xff0c;動手開發一個功能強大且美觀…

基于騰訊云高性能HAI-CPU的跨境電商客服助手全鏈路解析

跨境電商的背景以及痛點 根據Statista數據&#xff0c;2025年全球跨境電商市場規模預計達6.57萬億美元&#xff0c;年增長率保持在12.5% 。隨著平臺規則趨嚴&#xff08;如亞馬遜封店潮&#xff09;&#xff0c;更多賣家選擇自建獨立站&#xff0c;2024年獨立站占比已達35%。A…

maven的項目構建

常用構建命令 命令說明mvn clean清理編譯結果&#xff08;刪掉target目錄&#xff09;mvn compile編譯核心代碼&#xff0c;生成target目錄mvn test-compile編譯測試代碼&#xff0c;生成target目錄mvn test執行測試方法mvn package打包&#xff0c;生成jar或war文件mvn insta…

定時任務和分布式任務框架

文章目錄 一 Spring Task1.@Scheduled注解介紹2 基本用法(1)使用@EnableScheduling修飾啟動類(2)創建定時任務的類(3)fixedDelay(4)fixedRate(5)cron3 執行多個任務4 設置異步執行5 @Async使用自定義線程池6 缺點二 xxl-job介紹架構圖與其他任務調度平臺的比較運行調…