做免費(fèi)網(wǎng)站教程國vs百度seo排名優(yōu)化軟件化
1.介紹
策略模式(Strategy Pattern)是一種行為型設(shè)計模式,它定義了一系列算法,封裝每一個算法,并使它們可以相互替換。策略模式使得算法的變化獨(dú)立于使用算法的客戶端。
2.主要作用
策略模式的主要作用是將算法或行為的選擇從使用者中分離出來,使得可以在運(yùn)行時選擇不同的算法或行為。這種方式使得代碼更加靈活、可擴(kuò)展。
3.解決的問題
策略模式的主要作用是通過定義一系列算法,使得它們可以相互替換,從而達(dá)到以下幾個目的:
- 算法選擇:需要根據(jù)不同的條件選擇不同的算法時,可以使用策略模式避免復(fù)雜的條件語句。
- 代碼復(fù)用:通過封裝不同的策略,減少代碼重復(fù),提高可復(fù)用性。
- 算法獨(dú)立:使得算法的變化獨(dú)立于使用它的客戶端,便于擴(kuò)展和維護(hù)
4.模式原理
包含角色:
- 策略接口(Strategy):定義一系列算法的接口,所有具體策略都需要實現(xiàn)這個接口。
- 具體策略(ConcreteStrategy):實現(xiàn)策略接口的具體類,每個具體策略實現(xiàn)不同的算法。
- 上下文(Context):持有一個策略的引用,提供選擇和使用策略的功能,通常允許在運(yùn)行時改變所用策略。
UML類圖:
代碼示例:
使用策略模式來實現(xiàn)不同的排序算法。
// 策略接口
interface SortStrategy {void sort(int[] array);
}// 具體策略:快速排序
class QuickSort implements SortStrategy {public void sort(int[] array) {// 實現(xiàn)快速排序System.out.println("使用快速排序");}
}// 具體策略:冒泡排序
class BubbleSort implements SortStrategy {public void sort(int[] array) {// 實現(xiàn)冒泡排序System.out.println("使用冒泡排序");}
}// 上下文
class SortContext {private SortStrategy strategy;public void setStrategy(SortStrategy strategy) {this.strategy = strategy;}public void sort(int[] array) {strategy.sort(array);}
}// 使用
public class StrategyPatternExample {public static void main(String[] args) {SortContext context = new SortContext();int[] array = {5, 2, 9, 1};context.setStrategy(new QuickSort());context.sort(array); // 輸出:使用快速排序context.setStrategy(new BubbleSort());context.sort(array); // 輸出:使用冒泡排序}
}
策略模式結(jié)構(gòu)不算復(fù)雜,更容易理解,在項目中使用的也比較多,再舉個我在項目中遇到的真實案例吧:
當(dāng)時做跑步機(jī)軟件,有個需求是需要顯示心率值,而心率的來源有多個,比如:心率手柄,華為運(yùn)動健康,還有其他App,他們之間還有優(yōu)先級,華為運(yùn)動健康第一,其他App第二,心率手柄第三,當(dāng)三個心率源都有心率上報時,需要根據(jù)優(yōu)先級進(jìn)行顯示心率值,而在獲取心率值的時候 就只需在 策略模式所說的上下文 中get
就行了,無需關(guān)心內(nèi)部實現(xiàn),至于策略動態(tài)切換,以及其他相關(guān)邏輯都包含在了上下文中。
當(dāng)然,上述概念和舉例只是幫助你快速理解策略模式,以及在實際項目中遇到相應(yīng)需求能想到它就可以了,真實的需求實現(xiàn)肯定不會像示例中那么簡單,記得靈活運(yùn)用。
5.優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 靈活性:允許在運(yùn)行時根據(jù)需要切換算法。
- 可擴(kuò)展性:新的算法可以很方便地加入到系統(tǒng)中,無需修改原有的代碼。
- 避免條件語句:策略模式避免了復(fù)雜的條件語句,使代碼更加清晰。
缺點(diǎn)
- 客戶端必須了解不同的策略:客戶端需要理解不同策略之間的差異,選擇合適的策略。
6.應(yīng)用場景
- 多種算法選擇:當(dāng)需要根據(jù)不同條件選擇不同算法時,如排序、支付方式等。
- 需要封裝一系列的算法:例如圖形繪制中,可以根據(jù)不同的圖形類型選擇不同的繪制策略。
- 需要使用不同策略的對象:例如,系統(tǒng)中有多個對象需要使用不同的策略,但又希望統(tǒng)一管理。
這時候你是不是突然想拿自己項目中的某些功能練手了😎,各位不要隨便為了設(shè)計而修改現(xiàn)有完善模塊代碼哈,能跑就行 🤪,開個玩笑,設(shè)計模式就是為了方便我們寫出更容易維護(hù),更適合自己的代碼的,而不是為了設(shè)計而設(shè)計的。
還有還有 說到這了再提一嘴😁
硬編碼和條件判斷(if…else 或 switch)
大家在項目中寫沒寫過 通過 if...else
或 switch
來選擇不同的執(zhí)行路徑,使用哪種算法,哪種解析方式,哪種網(wǎng)絡(luò)請求… 這中if...else
或 switch
選擇方式我們叫做硬編碼,當(dāng)條件足夠多的時候,看著很不美觀,維護(hù)難度也大,恰恰這種類型的代碼,可以使用策略模式代替哦!
7.總結(jié)
策略模式通過將算法封裝為獨(dú)立的策略類,提供了一種靈活的方式來選擇和使用算法。它提高了代碼的可維護(hù)性和擴(kuò)展性,符合面向?qū)ο笤O(shè)計的基本原則。在需要動態(tài)選擇算法和減少條件判斷時,策略模式是一種非常有效的解決方案。