妙解設計模式之策略模式

目錄

  • 策略模式的概念
    • 生活中的例子
    • 編程中的例子
  • 軟件工程中的實際應用
    • 數據排序
    • 文件壓縮
    • 支付方式
    • 圖形繪制

策略模式的概念

策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一系列算法,把它們一個個封裝起來,并且使它們可以相互替換。這種模式使得算法可以獨立于使用它的客戶端而變化。

策略模式的關鍵點

  1. 策略接口(Strategy):定義所有策略(算法)共有的方法。
  2. 具體策略類(ConcreteStrategy):實現策略接口的具體算法。
  3. 上下文類(Context):持有一個策略對象,并在需要時調用這個策略的方法。

策略模式的優點

  1. 易于擴展:增加新算法時,只需添加新的具體策略類,不需要修改現有的代碼。
  2. 避免使用多重條件語句:通過使用策略模式,可以避免大量的 if-elseswitch 語句,使代碼更加簡潔和清晰。
  3. 提高代碼的靈活性和可維護性:可以動態地改變算法,而不需要修改客戶端代碼。

策略模式的缺點

  1. 增加類的數量:每個具體策略都是一個單獨的類,會導致類的數量增多,增加代碼的復雜性。
  2. 所有策略類都需要暴露:策略類需要對外公開,以便可以被選擇和使用。

生活中的例子

策略模式是一種設計模式,它允許你定義一系列算法(或者叫方法),然后在運行時選擇其中一個來使用。就像你有一個裝滿不同類型武器的工具箱,每次打怪獸的時候,你可以選擇最合適的武器來使用。

編程中的例子

策略接口

// 定義策略接口
public interface AttackStrategy {void attack();
}

這個接口定義了一個 attack 方法,所有的具體策略類都需要實現這個方法。

具體策略類

// 使用劍攻擊
public class SwordAttack implements AttackStrategy {@Overridepublic void attack() {System.out.println("使用劍攻擊怪獸!");}
}// 使用弓箭攻擊
public class BowAndArrowAttack implements AttackStrategy {@Overridepublic void attack() {System.out.println("使用弓箭攻擊怪獸!");}
}// 使用魔法攻擊
public class MagicAttack implements AttackStrategy {@Overridepublic void attack() {System.out.println("使用魔法攻擊怪獸!");}
}

這些類實現了 AttackStrategy 接口,并提供了具體的攻擊方法。

上下文類

// 上下文類
public class MonsterHunter {private AttackStrategy strategy;// 設置策略public void setStrategy(AttackStrategy strategy) {this.strategy = strategy;}// 執行攻擊public void attackMonster() {strategy.attack();}
}

上下文類 MonsterHunter 持有一個 AttackStrategy 對象,并在 attackMonster 方法中調用策略對象的 attack 方法。

使用策略模式

public class Main {public static void main(String[] args) {MonsterHunter hunter = new MonsterHunter();// 使用劍攻擊hunter.setStrategy(new SwordAttack());hunter.attackMonster();// 使用弓箭攻擊hunter.setStrategy(new BowAndArrowAttack());hunter.attackMonster();// 使用魔法攻擊hunter.setStrategy(new MagicAttack());hunter.attackMonster();}
}

在這個例子中,我們創建了一個 MonsterHunter 對象,并通過 setStrategy 方法動態設置不同的攻擊策略。每次設置策略后,我們調用 attackMonster 方法來執行相應的攻擊。

軟件工程中的實際應用

數據排序

在應用程序中,你可能需要對數據進行排序,但不同情況下的排序規則可能不同。例如,有時候需要按名字排序,有時候需要按年齡排序。這時,可以使用策略模式定義不同的排序算法,并根據需要選擇合適的算法。

// 定義排序策略接口
public interface SortStrategy {void sort(int[] numbers);
}// 具體策略類:冒泡排序
public class BubbleSort implements SortStrategy {@Overridepublic void sort(int[] numbers) {// 實現冒泡排序算法}
}// 具體策略類:快速排序
public class QuickSort implements SortStrategy {@Overridepublic void sort(int[] numbers) {// 實現快速排序算法}
}// 上下文類
public class Sorter {private SortStrategy strategy;public void setStrategy(SortStrategy strategy) {this.strategy = strategy;}public void sort(int[] numbers) {strategy.sort(numbers);}
}// 使用策略模式進行排序
public class Main {public static void main(String[] args) {int[] numbers = {5, 2, 9, 1, 5, 6};Sorter sorter = new Sorter();sorter.setStrategy(new BubbleSort());sorter.sort(numbers);sorter.setStrategy(new QuickSort());sorter.sort(numbers);}
}

文件壓縮

在文件壓縮工具中,可能支持多種壓縮算法,比如 ZIP、RAR、TAR 等。可以使用策略模式來選擇不同的壓縮算法

// 定義壓縮策略接口
public interface CompressionStrategy {void compress(String filePath);
}// 具體策略類:ZIP壓縮
public class ZipCompression implements CompressionStrategy {@Overridepublic void compress(String filePath) {// 實現ZIP壓縮算法}
}// 具體策略類:RAR壓縮
public class RarCompression implements CompressionStrategy {@Overridepublic void compress(String filePath) {// 實現RAR壓縮算法}
}// 上下文類
public class Compressor {private CompressionStrategy strategy;public void setStrategy(CompressionStrategy strategy) {this.strategy = strategy;}public void compress(String filePath) {strategy.compress(filePath);}
}// 使用策略模式進行文件壓縮
public class Main {public static void main(String[] args) {Compressor compressor = new Compressor();compressor.setStrategy(new ZipCompression());compressor.compress("example.txt");compressor.setStrategy(new RarCompression());compressor.compress("example.txt");}
}

支付方式

在電商網站中,用戶可能使用不同的支付方式,例如信用卡支付、PayPal 支付、銀行轉賬等。可以使用策略模式來實現不同的支付方式。

// 定義支付策略接口
public interface PaymentStrategy {void pay(double amount);
}// 具體策略類:信用卡支付
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {// 實現信用卡支付}
}// 具體策略類:PayPal支付
public class PayPalPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {// 實現PayPal支付}
}// 上下文類
public class PaymentProcessor {private PaymentStrategy strategy;public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public void processPayment(double amount) {strategy.pay(amount);}
}// 使用策略模式進行支付
public class Main {public static void main(String[] args) {PaymentProcessor processor = new PaymentProcessor();processor.setStrategy(new CreditCardPayment());processor.processPayment(100.0);processor.setStrategy(new PayPalPayment());processor.processPayment(100.0);}
}

圖形繪制

在圖形應用程序中,可能需要使用不同的繪制算法,比如繪制線條、繪制矩形、繪制圓形等。可以使用策略模式來封裝不同的繪制算法。

// 定義繪制策略接口
public interface DrawStrategy {void draw();
}// 具體策略類:繪制線條
public class DrawLine implements DrawStrategy {@Overridepublic void draw() {// 實現繪制線條的算法}
}// 具體策略類:繪制矩形
public class DrawRectangle implements DrawStrategy {@Overridepublic void draw() {// 實現繪制矩形的算法}
}// 具體策略類:繪制圓形
public class DrawCircle implements DrawStrategy {@Overridepublic void draw() {// 實現繪制圓形的算法}
}// 上下文類
public class GraphicEditor {private DrawStrategy strategy;public void setStrategy(DrawStrategy strategy) {this.strategy = strategy;}public void draw() {strategy.draw();}
}// 使用策略模式進行繪圖
public class Main {public static void main(String[] args) {GraphicEditor editor = new GraphicEditor();editor.setStrategy(new DrawLine());editor.draw();editor.setStrategy(new DrawRectangle());editor.draw();editor.setStrategy(new DrawCircle());editor.draw();}
}

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

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

相關文章

Android Graphics模塊中的各種State和重要類普法

Android Graphics模塊中的各種State和重要類普法 引言 尼瑪,這Android Graphics圖形棧蛋疼啊,更新太快了。機會是每年一個版本,前進的膠布不能停啊,繼續干。這邊博客,我們的核心是理一理Android Graphics中各種State狀…

2024最新版本激活Typora,1.8.10.0版本可用

?實測可用日期為:2024-05-28 目前最新版本 1.8.10.0 也是可以實現激活的 注:免修改注冊表、不用修改時間,更不需要破解補丁 01、下載&安裝 Typora 文件 從官網下載最新版本的 Typora,并安裝 或者阿里云盤: htt…

Pytorch深度學習實踐筆記12(b站劉二大人)

🎬個人簡介:一個全棧工程師的升級之路! 📋個人專欄:pytorch深度學習 🎀CSDN主頁 發狂的小花 🌄人生秘訣:學習的本質就是極致重復! 《PyTorch深度學習實踐》完結合集_嗶哩嗶哩_bilibi…

數據集008:吸煙、抽煙檢測數據集(含數據集下載鏈接)

數據集簡介 兩個數據集 一個是783張圖片對應的xml文件 一個是2482張圖片對應的xml文件 如下圖所示: 部分代碼: # 測試數據讀取 def test_data_loader(datadir, batch_size 10, test_image_size608, modetest):"""加載測試用的圖片…

大學生選擇算法向還是嵌入式向?

在開始前剛好我有一些資料,是我根據網友給的問題精心整理了一份「嵌入式的資料從專業入門到高級教程」, 點個關注在評論區回復“888”之后私信回復“888”,全部無償共享給大家!!! 由于嵌入式的薪資待遇和…

品牌建設不迷路:系統化方法讓品牌成長更高效

很多創始人才創業過程中都會發現: 企業越大,遇到的系統性的底層品牌問題就會越多,品牌的系統化建設底層根基如果不穩,后續的增長也會搖搖欲墜。 所以在當今競爭激烈的市場環境中,品牌的成功不僅僅依靠一個響亮的名字…

Spring Boot注解(Annotation)

在Spring Boot中,注解(Annotation)是一種元數據形式,它可以在代碼中提供信息,這些信息可以在運行時或編譯時被處理。Spring Boot使用注解來實現依賴注入、事務管理、配置等功能。 以下是Spring Boot中注解的執行機制的…

【Linux】Linux的權限_1

文章目錄 三、權限1. shell外殼2. Linux的用戶3. Linux權限管理文件訪問者的分類文件類型和訪問權限 未完待續 三、權限 1. shell外殼 為什么要使用shell外殼 由于用戶不擅長直接與操作系統直接接觸和操作系統的易用程度、安全性考慮,用戶不能直接訪問操作系統。 什…

文件IO(一)

文件IO(一) 文件IO文件的分類在文件IO下,文件分類按存儲的內容分按照操作分 標準IO和文件IO的區別系統調用和庫函數的區別 文件IO 把程序暫存在內存的數據,存儲到本地外存上 文件的分類 在Linux系統下,文件共分為7類…

AI答題項目,無門檻答題一小時收益30+

朋友們,今天我想和大家探討一個令人興奮的副業機遇。你是否曾感覺到日常工作的枯燥乏味,而又渴望找到一種輕松的賺錢方式來增加你的收入?今天我將和你分享的這個項目正是你所期待的。 項目的核心是利用AI技術來回答網上付費用戶的問題&…

重生之我要精通JAVA--第六周筆記

File 路徑 相對路徑 路徑1:“a.txt” 路徑2:“abc\\a.txt” 絕對路徑 路徑1:“c:\\a.txt” 路徑2:“c:\\abc\\a.txt” File對象就表示一個路徑,可以是文件的路徑、也可以是文件夾的路徑這個路徑可以是存在的&…

linux線程,線程控制與線程相關概念

線程概念 線程這個詞或多或少大家都聽過,今天我們正式的來談一下線程; 在我一開始的概念中線程就是進程的一部分,一個進程中有很多個線程,這個想法基本是正確的,但細節部分呢我們需要細細講解一下; 什么…

“揭秘:為什么羊駝Ollama成為計算機運行大型語言模型的最佳拍檔?“

最近,AIM 評測了在計算機上本地運行大語言模型(LLM)的最佳工具,Ollama 脫穎而出,成為最高效的解決方案,提供了無與倫比的靈活性。Ollama 是 Jeffrey Morgan 開發的一款開源工具,它正在徹底改變愛…

我被恐嚇了,對方揚言要壓測我的網站

大家好我是聰,昨天真是水逆,在技術群里交流問題,竟然被人身攻擊了!罵的話太難聽具體就不加討論了,人身攻擊我可以接受,我接受不了他竟然說要刷我接口!!!!這下…

啟用標準大頁后內存使用率下降了

未啟用前 [rootol819c ~]# free -htotal used free shared buff/cache available Mem: 9.3Gi 984Mi 379Mi 1.5Gi 8.0Gi 6.8Gi Swap: 15Gi 3.0Mi 15Gi [rootol819c ~]# free -htotal …

【NumPy】掌握NumPy的histogram函數:數據直方圖的生成與應用詳解

🧑 博主簡介:阿里巴巴嵌入式技術專家,深耕嵌入式人工智能領域,具備多年的嵌入式硬件產品研發管理經驗。 📒 博客介紹:分享嵌入式開發領域的相關知識、經驗、思考和感悟,歡迎關注。提供嵌入式方向…

速度百倍提升,高性能 Python 編譯器 Codon 火了

引言 在當下的編程世界里,Python由于其易用性和強大的庫支持在數據科學、人工智能和網頁開發等多個領域占據著舉足輕重的地位。然而,Python的執行速度往往成為開發者的一大痛點。 針對 這一問題,Codon項目正試圖提供一個高效的解決方案。Codo…

java新特性(Stream API)

什么是 Stream API? Stream API 是 Java 8 引入的一個用于對集合數據進行函數式編程操作的強大的庫。它允許我們以一種更簡潔、易讀、高效的方式來處理集合數據,可以極大提高 Java 程序員的生產力,是目前為止對 Java 類庫最好的補充。 Stream API 的核心思想是將數據處理操作…

小識MFC,一套設計優雅與不優雅并存的類庫----小話MFC(2)

Q1: CPoint繼承于POINT,這樣有什么好處? A: 繼承的一個最基本的好處當然就是減少代碼量。CPoint和POINT內部數據一樣,只是一個提供了更多的方法來操作對象。 typedef struct tagPOINT {LONG x;LONG y; } POINT, *P…

【Flutter】動畫介紹隱式動畫

🔥 本文由 程序喵正在路上 原創,CSDN首發! 💖 系列專欄:Flutter學習 🌠 首發時間:2024年5月28日 🦋 歡迎關注🖱點贊👍收藏🌟留言🐾 目…