設計模式詳解(一)——策略模式

策略模式(Strategy Pattern)是一種行為型的設計模式,它允許你定義一系列算法,然后將它們封裝起來,使它們可以相互替換。這樣做的好處是,你可以動態地選擇要使用的算法,而不必在運行時進行檢查或實例化。

1、策略模式通常由三個角色組成:

  1. 策略接口/抽象類:定義了算法的接口或抽象類。
  2. 具體策略實現:實現了策略接口或抽象類的具體類。
  3. 客戶端:使用策略接口或抽象類來調用具體的策略實現。

2、示例:

下面是一個簡單的Java示例,展示了如何使用策略模式來實現加法運算:

// 定義策略接口
interface CalculatorStrategy {int calculate(int a, int b);
}// 具體策略實現
class AddStrategy implements CalculatorStrategy {@Overridepublic int calculate(int a, int b) {return a + b;}
}class SubtractStrategy implements CalculatorStrategy {@Overridepublic int calculate(int a, int b) {return a - b;}
}// 客戶端
class Client {private CalculatorStrategy strategy;public void setStrategy(CalculatorStrategy strategy) {this.strategy = strategy;}public int calculate(int a, int b) {return strategy.calculate(a, b);}
}public class StrategyPatternExample {public static void main(String[] args) {// 創建客戶端Client client = new Client();// 設置策略client.setStrategy(new AddStrategy());// 調用客戶端System.out.println(client.calculate(5, 3)); // 輸出 8// 更改策略并再次調用客戶端client.setStrategy(new SubtractStrategy());System.out.println(client.calculate(5, 3)); // 輸出 2}
}

在這個例子中,我們定義了一個CalculatorStrategy接口,它包含了一個calculate(int a, int b)方法。然后我們創建了兩個具體的策略實現AddStrategySubtractStrategy,分別實現了加法和減法操作。最后,我們在客戶端中設置不同的策略,并通過調用calculate(int a, int b)方法來執行相應的計算。

3、策略模式的使用場景:

算法選擇:當需要根據不同的條件來選擇不同的算法時,策略模式非常適用。例如,在一個游戲中,可能需要根據玩家的等級來選擇不同的難度級別。
參數化接口:當需要定義一系列相關的類,而這些類都共享相同的接口或抽象類時,策略模式可以幫助你簡化代碼,并提高代碼的可維護性。
擴展性:策略模式允許你動態地添加新的算法,而無需修改現有的代碼。

4、優缺點

優點:

靈活性:由于策略模式允許你在運行時動態地切換算法,因此它提高了代碼的靈活性和可擴展性。
可維護性:策略模式使得代碼更加模塊化,每個具體的策略實現都是獨立的,這樣就更容易理解和維護。
復用性:策略模式鼓勵代碼的復用,因為你可以創建多個具體的策略實現,并在需要時動態地選擇其中一個。

缺點:

復雜性:策略模式可能會增加代碼的復雜性,特別是當你有大量策略實現時。

性能開銷:由于策略模式涉及到對象的創建和銷毀,所以在某些情況下,它可能會帶來一定的性能開銷。

5、策略模式的應用舉例:

在游戲開發中,可以使用策略模式來實現不同類型的敵人行為,比如普通敵人、BOSS等。
在電子商務網站中,可以使用策略模式來實現不同的商品促銷策略,比如打折、滿減等。

總的來說,策略模式是一種強大的設計模式,它能夠幫助你有效地解決一些特定的問題,但同時也需要注意其潛在的復雜性和性能影響。

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

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

相關文章

多媒體基礎

筆者按: 昨日復習的信息網絡安全約莫是掛了,常言道:知恥而后勇。誠如斯言 于是決心多媒體是不能再掛了,不然直接變成xxx之流,自增笑耳 語雀鏈接:多媒體基礎 一.多媒體計算機概述 媒體:承載信息…

動手學深度學習(Pytorch版)代碼實踐 -卷積神經網絡-21多輸入多輸出通道

21多輸入多輸出通道 import torch from d2l import torch as d2ldef corr2d(X, K):"""計算二維互相關運算"""h, w K.shapeY torch.zeros((X.shape[0] - h 1, X.shape[1] - w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,…

go語言DAY7 字典Map 指針 結構體 函數

Go中Map底層原理剖析_go map底層實現-CSDN博客 目錄 Map 鍵值對key,value 注意: map唯一確定的key值通過哈希運算得出哈希值 一、 map的聲明及初始化: 二、 map的增刪改查操作: 三、 map的賦值操作與切片對比: 四、 通用所有…

[leetcode hot 150]第一百二十二題,買賣股票的最佳時機Ⅱ

題目: 給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。 在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。 返回 你能獲得的 最大…

【C++】初識C++(一)

一.什么是C C語言是結構化和模塊化的語言,適合處理較小規模的程序。對于復雜的問題,規模較大的程序,需要高度 的抽象和建模時,C語言則不合適。為了解決軟件危機, 20世紀80年代, 計算機界提出了OOP(object o…

圖形處理單元(GPU)在現代計算中的應用與挑戰(研究論文框架)

摘要:隨著高性能計算需求的日益增長,圖形處理單元(GPU)已從專業的圖形渲染處理器轉變為具有高性能并行處理能力的多功能計算平臺。本文將探討GPU的核心優勢、編程模型、在不同領域的應用以及面臨的挑戰和限制。此外,還將討論GPU技術的未來發展趨勢和潛在的研究機會。 關鍵…

mongodb 查詢語句學習筆記

基礎查詢 正則查詢 {status: A,$or: [{ qty: { $lt: 30 } }, { item: { $regex: ^p } }] }AND 查詢 { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }OR 查詢 { $or: [ { status: "A" }, { qty: { $lt: 30 } …

2024年機動車簽字授權人題庫,助你沖刺!絕對不會讓你后悔!

61.()使汽車按駕駛人選定的方向行駛。 A.傳動系統 B.行駛系統 C.轉向系統 D.制動系統 答案:C 62.()使汽車各總成及部件安裝在適當的位置,對全車起支承作用以保證汽車正常行駛。 A.傳動系統 B.行駛系…

01.計算機圖形學概述

01.計算機圖形學概述 從技術的角度上看,什么是一個好的畫面? 直接看這個畫面是不是足夠亮,這體現了渲染中的一個技術叫全局光照。 應用范圍 游戲( Video Games)電影/特效( Movies)動漫/動畫&…

如何讓Linux系統變得更安全?

本文嘗試從linux安全加固、漏洞利用及防御措施、安全意識三個方面思考如何讓linux系統變得更加安全. 一、linux常見安全加固操作 對Linux系統進行詳細的安全加固操作,可以從多個方面進行,包括系統更新和補丁管理、用戶和權限管理、網絡安全配置、文件和系統安全、日志和審計…

Qt代碼分析

要使用代碼分析工具,請在Analyze菜單或(Start Debugging of Startup Project)按鈕的下拉菜單中選擇它。當您處于調試模式時,您可以通過在調試器工具欄上的菜單中選擇工具來切換工具。 您可以將調試模式下的視圖拖放到屏幕上的新位置。意見的大小和立場將…

c++關鍵字default,delete

文章目錄 概述defaultdelete 小結 概述 在看一些開源項目的源碼的時候,經常會看到default和delete。這2個關鍵字究竟什么意思呢?這篇文章就來一點一點拆解下。 default 默認構造函數、拷貝構造函數、移動構造函數、拷貝賦值運算符、移動賦值運算符和析…

HDFS學習

3.5 HDFS存儲原理 3.5.1 冗余數據保存 作為一個分布式文件系統,為了保證系統的容錯性和可用性,HDFS采用了多副本方式對數據進行冗余存儲,通常一個數據塊的多個副本會被分布到不同的數據節點上。 如圖所示,數據塊1被分別存放到…

石油化工廠為什么要用專業防爆手機?

防爆手機之所以必須使用專業設計的產品,主要是出于安全考慮,以防止在易燃易爆環境中因手機使用不當引發爆炸事故。以下幾點詳細解釋了使用專業化工防爆手機的必要性: 本質安全設計:頂堅專業防爆手機采用了本質安全(本安…

動手學深度學習(Pytorch版)代碼實踐 -計算機視覺-47轉置卷積

47轉置卷積 import torch from torch import nn from d2l import torch as d2l# 輸入矩陣X和卷積核矩陣K實現基本的轉置卷積運算 def trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[0] h - 1, X.shape[1] w - 1))for i in range(X.shape[0]):for j in range(X.shap…

昇思25天學習打卡營第5天|數據變換Transforms

數據變換Transforms 介紹Transforms分類Common TransformsVision TransformsText TransformsPythonTokenizer LookupLambda Transforms 參考 介紹 MindSpore提供不同種類的數據變換(Transforms),配合數據處理Pipeline來實現數據預處理。 所有…

【ROS】apt 找不到 ROS版本?(ROS1和ROS2通用方案)

問題描述 安裝ROS底層系統時,經常遇到一個情況就是apt找不到ros的對應版本 解決方案 添加ros官方給的apt源和安裝密鑰 ROS1 # ros獎項 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.li…

數學建模 —— MATLAB中的向量

目錄 向量的創建方法 (1)直接輸入法 (2)冒號法(常用) (3)利用MATLAB函數創建 linspace函數 logspace函數 向量元素的引用 (1)單個元素引用 (2)多個元素引用 向量元素的修改和刪除 向量的創建方法 在 MATLAB中,向量的創建方法主要有…

微軟Edge瀏覽器多用戶配置文件管理:個性化瀏覽體驗

在家庭或工作環境中,經常需要在同一臺計算機上為多個用戶創建和管理獨立的瀏覽體驗。微軟Edge瀏覽器提供了多用戶配置文件管理功能,允許用戶為每個賬戶設置獨立的書簽、歷史記錄、密碼、擴展和設置。本文將詳細介紹如何在微軟Edge中管理多個用戶配置文件…

連接Sql Server時報錯:無法通過使用安全套接字層加密與 SQL Server 建立安全連接

JDBC連接Sql Server時報錯:無法通過使用安全套接字層加密與 SQL Server 建立安全連接 前言解決辦法一解決辦法二總結 前言 今天使用jdbc連接sql server突然報錯為:SQLServerException: “Encrypt”屬性設置為“true”且 “trustServerCertificate”屬性設置為“fals…