設計模式之策略模式詳解

目錄

什么是策略模式

應用場景

業務場景實現

抽象類

實現類

Context上下文

測試類

策略模式的優缺點


什么是策略模式

他將定義的算法家族、分別封裝起來,讓他們之間可以相互替換,從而讓算法的變化不會影響到使用算法的用戶。

策略模式使用的就是面向對象的繼承和多態機制,從而實現同一行為在不同場景下具備不同實現。

應用場景


策略模式在生活中應用很多。比如一個人的膠水比例與他的工資有關,不同的工資水平對應不同的稅率;再比如我們在下單前需要選擇支付方式,或者是商店折扣、比如支付寶、微信等。

策略模式可以解決在多種算法相似的情況下,避免使用if.else或switch…case帶來的復雜性和臃腫性。在日常業務開發中,策略模式適用于以下場景:


首先看下策略模式的通用UML類圖:

從類圖中,我們可以看到,策略模式主要包含三種角色:

上下文角色(Context)

用來操作策略的上下文環境,屏蔽高層模塊(客戶端)對策略,算法的直接訪問,封裝可能存在的變化。

抽象策略角色(Strategy)

規定策略或算法的行為

具體策略角色(Concrete Strategy)

具體的策略或算法實現

業務場景實現

抽象類

/*** 策略類,定義所有支持的算法公共接口*/
/*** 抽象算法類*/
public abstract class strategy {//算法方法public abstract void algorithmInterface();}

實現類

public class ConcreteStrategyA extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法A實現");}
}
public class ConcreteStrategyB extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法B實現" );}
}
public class ConcreteStrategyC extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法C實現");}
}

Context上下文

/*** 上下文,維護對象的引用*/
public class content {strategy strategy;public content(策略模式.strategy strategy) {this.strategy = strategy;}public void  contentInterface(){//根據具體的策略對象,調用琦算法的方法strategy.algorithmInterface();}
}

測試類

public class main {public static void main(String[] args) {content content1;content1 = new content(new ConcreteStrategyA());content1.contentInterface();content1 = new content(new ConcreteStrategyB());content1.contentInterface();content1 = new content(new ConcreteStrategyC());content1.contentInterface();}
}

策略模式的優缺點

優點

  • 策略模式符合開閉原則
  • 避免使用多重條件轉移語句,如if…else和switch這種。
  • 使用策略模式可以提高算法的保密性和安全性

缺點

  • 客戶端需要知道所有的策略,并且自行決定使用哪一個策略類
  • 代碼中會產生非常多的策略類,造成代碼的臃腫,怎加維護難度。

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

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

相關文章

idea出現莫名其妙錯的時候

正常情況idea使用起來都很順手,但是當項目比較多的時候,可能出現莫名奇妙的錯誤,比如導入的包始終報錯java: 程序包com不存在,或者引入自己寫的包也不存在,或者始終出現紅線但是排查之后沒有問題的情況,這種…

進來吧,給自己10分鐘,這篇文章帶你直接學會python

Python的語言特性 Python是一門具有強類型(即變量類型是強制要求的)、動態性、隱式類型(不需要做變量聲明)、大小寫敏感(var和VAR代表了不同的變量)以及面向對象(一切皆為對象)等特點的編程語言。 獲取幫助 你可以很容易的通過Python解釋器獲取幫助。如果你想知道一個對象(o…

OJ:鏈表的中間結點

876. 鏈表的中間結點 - 力扣(LeetCode) 思路 思路:首先最容易想到的思路是什么呢,就是先遍歷一遍鏈表,用一個值count來記錄鏈表的長度,然后我們運用除法,/2,結果是幾,就…

【C++干貨基地】揭秘C++11常用特性:內聯函數 | 范圍for | auto自動識別 | nullptr指針空值

🎬 鴿芷咕:個人主頁 🔥 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! 引入 哈嘍各位鐵汁們好啊,我是博主鴿芷咕《C干貨基地》是由我的襄陽家鄉零食基地有感而發,不知道各位的…

平臺工程: 用Backstage構建開發者門戶 - 2

本文介紹了如何使用開源Backstage構建自己的開發者門戶,并基于此實踐平臺工程。本系列共兩篇文章,這是第二篇。原文: Platform Engineering: Building Your Developer Portal with Backstage — Part 2 在本教程第一部分中我們了解了Backstage這個用于構…

外貿網站模板建站

測繪檢測wordpress外貿主題 簡潔實用的wordpress外貿主題,適合做測繪檢測儀器設備的外貿公司使用。 https://www.jianzhanpress.com/?p5337 白馬非馬衣服WordPress外貿建站模板 白馬非馬服裝行業wordpress外貿建站模板,適用于時間服裝企業的官方網站…

Git 如何上傳本地的所有分支

Git 如何上傳本地的所有分支 比如一個本地 git 倉庫里定義了兩個遠程分支,一個名為 origin, 一個名為 web 現在本地有一些分支是 web 遠程倉庫沒有的分支,如何將本地所有分支都推送到 web 這個遠程倉庫上呢 git push web --all

pytorch loss函數整理

變量名解釋 logits:未經過normalize(未經過激活函數處理)的原始分數,例如一個mlp將特征映射到num_target_class維的輸出tensor就是logits。 probs:probabilities的簡寫,logits經過sigmoid函數,…

Doris實戰——銀聯商務實時數倉構建

目錄 前言 一、應用場景 二、OLAP選型 三、實時數倉構建 四、實時數倉體系的建設與實踐 4.1 數倉分層的合理規劃 4.2 分桶分區策略的合理設置 4.3 多源數據遷移方案 4.4 全量與增量數據的同步 4.5 離線數據加工任務遷移 五、金融級數倉穩定性最佳實踐 5.1 多租戶資…

Jenkins的Pipeline概念

文章目錄 Pipeline什么是Jenkins Pipeline聲明式和腳本式Pipeline語法為何使用PipelinePipeline概念PipelineNodeStageStep Pipeline語法概述聲明式Pipeline腳本式Pipeline Pipeline示例 參考 Pipeline 什么是Jenkins Pipeline Jenkins Pipeline是一套插件,它支持…

【Django】model模型—模型繼承

Django中三種繼承風格 抽象基類:僅將父類用于子類公共信息的載體,這樣的父類永遠都不會單獨使用。多表繼承:繼承了一個模型(可能來源其它應用),且想要每個模型都有對應的數據表。代理模型:只想…

JProfiler相關問題及答案(2024)

1、JProfiler是什么及其用途 JProfiler是一款功能豐富的商業Java性能剖析(profiling)工具,它主要面向開發者和性能分析師,用于監測和分析Java應用程序的運行時行為。以下是對JProfiler的一些詳細介紹和它的主要用途: …

webpack的一些知識

核心 webpack 是用來搭建前端工程的它運行在node環境中,它所做的事情,簡單來說,就是打包具體來說,就是以某個模塊作為入口,根據入口分析出所有模塊的依賴關系,然后對各種模塊進行合并、壓縮,形…

洛谷P1157 組合的輸出

深搜板子加一點點修改&#xff0c;適合初學者體會深搜&#xff0c;具體看代碼 題目鏈接 ACcode #include<bits/stdc.h>using namespace std;int a, b;bitset<50>vis;//剪枝 int d[50];void dfs(int x) {if (x b 1) {for (int i 1;i < b;i)cout << se…

HBM(High Bandwidth Memory)

選擇正確的高帶寬內存 構建高性能芯片的選擇越來越多&#xff0c;但附加內存的選擇卻幾乎沒有變化。為了在汽車、消費和超大規模計算中實現最大性能&#xff0c;選擇取決于一種或多種 DRAM&#xff0c;而最大的權衡是成本與速度。 盡管多年來人們一直在努力用更快、更便宜或更…

Linux:kubernetes(k8s)搭建mater節點(kubeadm,kubectl,kubelet)(2)

安裝k8有多種方式如&#xff1a; minikube kubeadm 二進制安裝 命令行工具 我這里就使用kubeadm進行安裝 環境 3臺centos7 master ip &#xff1a;192.168.113.120 2G運存 2內核 node1 ip &#xff1a;192.168.113.121 2G運存 2內核 node2 ip &#xff1a;192.168.1…

重構與設計模型的完美融合:構建穩定可擴展系統的關鍵步驟

在軟件開發的漫長旅程中&#xff0c;系統的穩定性和可擴展性一直是開發者們追求的目標。為了實現這一目標&#xff0c;重構和設計模型成為了不可或缺的兩個關鍵元素。本文將探討如何通過重構&#xff0c;使系統更穩定、更具可擴展性&#xff0c;并深入研究如何將重構與設計模型…

JavaEE:多線程(3):案例代碼

目錄 案例一&#xff1a;單例模式 餓漢模式 懶漢模式 思考&#xff1a;懶漢模式是否線程安全&#xff1f; 案例二&#xff1a;阻塞隊列 可以實現生產者消費者模型 削峰填谷 接下來我們自己實現一個阻塞隊列 1.先實現一個循環隊列 2. 引入鎖&#xff0c;實現線程安全 …

運用qsort函數進行快排并使用C語言模擬qsort

qsort 函數的使用 首先qsort函數是使用快速排序算法來進行排序的&#xff0c;下面我們打開官網來查看qsort是如何使用的。 這里有四個參數&#xff0c;首先base 是至待排序的數組的首元素的地址&#xff0c;num 是值這個數組的元素個數&#xff0c;size 是指每個元素的大小&am…

Python猜數字小游戲

下面這段代碼是一個簡單的數字猜測游戲&#xff0c;其中計算機已經提前計算出了414 // 23的結果并存儲在變量num中。然后&#xff0c;程序會提示用戶來猜測這個結果。 以下是代碼的主要步驟和功能&#xff1a; 初始化&#xff1a; num 414 // 23&#xff1a;計算414除以23的整…