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