深入了解Java設(shè)計(jì)模式之策略模式
定義
定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。

解決的問題
在有多種算法相似的情況下,使用 if…else 所帶來的復(fù)雜和難以維護(hù)。
核心要點(diǎn)
把變化的代碼從不變的代碼中分離出來
針對接口編程而不是具體實(shí)現(xiàn)(類)
多用組合/聚合,少用繼承
客戶端通過組合的方式使用策略
類圖

溢出效用
對父類的局部改動,會影響其他部分(子類)、會有溢出效應(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ù)具體的策略對象,調(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的具體算法,可以放到配置文件中。
//運(yùn)行時(shí)讀取配置文件
public static void main(String[] args) {
Context context;
//new 一個(gè)context對象
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)了“開閉原則”??蛻舳嗽黾有袨椴挥眯薷脑写a,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語句(if…else if … else);
4)提供了可以替換繼承關(guān)心的辦法 :策略模式將算法封裝在獨(dú)立的Strategy類中使得你可以獨(dú)立于其Context改變它,使它易于切換、易于理解、易于擴(kuò)展。
5)需要注意的是 :每添加一個(gè)策略就要增加一個(gè)類,當(dāng)策略過多是會導(dǎo)致類數(shù)目龐大。
以上就是深入了解Java設(shè)計(jì)模式之策略模式的詳細(xì)內(nèi)容,更多關(guān)于Java策略模式的資料請關(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
java處理異常的機(jī)制關(guān)鍵字throw和throws使用解析
這篇文章主要介紹了java處理異常的機(jī)制關(guān)鍵字throw和throws使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java 關(guān)鍵字static詳解及實(shí)例代碼
這篇文章主要介紹了Java 關(guān)鍵字static詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04
Spring學(xué)習(xí)之開發(fā)環(huán)境搭建的詳細(xì)步驟
本篇文章主要介紹了Spring學(xué)習(xí)之開發(fā)環(huán)境搭建的詳細(xì)步驟,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
Java調(diào)用groovy實(shí)現(xiàn)原理代碼實(shí)例
這篇文章主要介紹了Java調(diào)用groovy實(shí)現(xiàn)原理代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12

