深入了解Java設計模式之策略模式
定義
定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。
解決的問題
在有多種算法相似的情況下,使用 if…else 所帶來的復雜和難以維護。
核心要點
把變化的代碼從不變的代碼中分離出來
針對接口編程而不是具體實現(xiàn)(類)
多用組合/聚合,少用繼承
客戶端通過組合的方式使用策略
類圖
溢出效用
對父類的局部改動,會影響其他部分(子類)、會有溢出效應
策略模式避免使用多重條件語句,比如if-else語句、Swtich語句
缺點:客戶端必須知道所有的策略類,并且自行決定使用哪一個策略類。
代碼實現(xiàn)
核心接口
/** * 策略接口 * * @author Promsing(張有博) * @version 1.0.0 * @since 2022/9/6 - 18:13 */ public interface Strategy { //頂層策略接口 void Strategy(); }
實現(xiàn)類-三個
/** * 策略實現(xiàn)A * * @author Promsing(張有博) * @version 1.0.0 * @since 2022/9/6 - 18:14 */ public class ConcreteStrategyA implements Strategy{ @Override public void Strategy() { System.out.println("算法A實現(xiàn)"); } } /** * 策略實現(xiàn)B * * @author Promsing(張有博) * @version 1.0.0 * @since 2022/9/6 - 18:14 */ public class ConcreteStrategyB implements Strategy { @Override public void Strategy() { System.out.println("算法B實現(xiàn)"); } } /** * 策略實現(xiàn)C * * @author Promsing(張有博) * @version 1.0.0 * @since 2022/9/6 - 18:14 */ public class ConcreteStrategyC implements Strategy{ @Override public void Strategy() { System.out.println("算法C實現(xiàn)"); } }
Context類
/** * 策略配置類,維護一個Strategy的引用 * * @author Promsing(張有博) * @version 1.0.0 * @since 2022/9/6 - 18:15 */ public class Context { //聲明策略接口 private Strategy strategy; //使用聚合的方式 public Context(Strategy strategy) { this.strategy = strategy; } //提供set方法,支持運行時改變算法 public void setStrategy(Strategy strategy) { this.strategy = strategy; } //根據(jù)具體的策略對象,調(diào)用其算法的方法 public void ContextStrategy(){ strategy.Strategy(); } }
Main方法
/** * 策略模式啟動類 * * @author Promsing(張有博) * @version 1.0.0 * @since 2022/9/6 - 18:19 */ public class Main { //TODO:代碼可以優(yōu)化,new的具體算法,可以放到配置文件中。 //運行時讀取配置文件 public static void main(String[] args) { Context context; //new 一個context對象 context=new Context(new ConcreteStrategyA()); context.ContextStrategy(); //運行時改變策略 context.setStrategy(new ConcreteStrategyB()); context.ContextStrategy(); context.setStrategy(new ConcreteStrategyC()); context.ContextStrategy(); } }
拓展
JDK源碼
Comparator接口是一個常用的比較器,其中compare()就是一個策略模式的抽象體現(xiàn)
public static void main2(String[] args) { Integer[] ints={1,3,8,2,4,9,0}; Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { if (o1 > o2) { return 1; } return -1; } }; Arrays.sort(ints,comparator); System.out.println(Arrays.toString(ints)); }
Spring源碼
Spring的初始化采用了策略模式,即不同類型的類采用不同的初始化策略。
策略模式的注意實現(xiàn)和細節(jié)
1)策略模式的關(guān)鍵是 :分析項目中變化部分與不變部分
2)策略模式的核心思想是 :多用組合/聚合,少用繼承;用行為類組合,而不是行為的繼承。更有彈性。
3)體現(xiàn)了“開閉原則”??蛻舳嗽黾有袨椴挥眯薷脑写a,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語句(if…else if … else);
4)提供了可以替換繼承關(guān)心的辦法 :策略模式將算法封裝在獨立的Strategy類中使得你可以獨立于其Context改變它,使它易于切換、易于理解、易于擴展。
5)需要注意的是 :每添加一個策略就要增加一個類,當策略過多是會導致類數(shù)目龐大。
以上就是深入了解Java設計模式之策略模式的詳細內(nèi)容,更多關(guān)于Java策略模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring MVC學習筆記之Controller查找(基于Spring4.0.3)
這篇文章主要給大家介紹了關(guān)于Spring MVC學習筆記之Controller查找(基于Spring4.0.3)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03java處理異常的機制關(guān)鍵字throw和throws使用解析
這篇文章主要介紹了java處理異常的機制關(guān)鍵字throw和throws使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09Spring學習之開發(fā)環(huán)境搭建的詳細步驟
本篇文章主要介紹了Spring學習之開發(fā)環(huán)境搭建的詳細步驟,具有一定的參考價值,有興趣的可以了解一下2017-07-07Java調(diào)用groovy實現(xiàn)原理代碼實例
這篇文章主要介紹了Java調(diào)用groovy實現(xiàn)原理代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12