策略模式
策略模式非常簡單,只需要將策略或者某個算法定義成一個類,然后傳給需要使用的對象即可。**定義:**該模式定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。策略模式屬于對象行為模式,它通過對算法進行封裝,把使用算法的責任和算法的實現(xiàn)分割開來,并委派給不同的對象對這些算法進行管理。例如在ArrayList
的sort()
中,如果想按照你自己的想法排序數組中的對象,你需要實現(xiàn)Comparator
并重寫排序方法,這個就是將排序策略封裝成了Comparator
對象。
策略模式的主要角色如下:
- 抽象策略(Strategy)類:這是一個抽象角色,通常由一個接口或抽象類實現(xiàn)。此角色給出所有的具體策略類所需的接口。
- 具體策略(Concrete Strategy)類:實現(xiàn)了抽象策略定義的接口,提供具體的算法實現(xiàn)或行為。
- 環(huán)境(Context)類:持有一個策略類的引用,最終給客戶端調用。
案例實現(xiàn)
【例】促銷活動
大家都參加過雙十一購物活動吧,假設京東商場的優(yōu)惠策略有很多種,那么哪一種最實惠呢?例如滿300減30為第一種策略,第二種為總價打九折,第三種為3000減600 優(yōu)惠券一張,不與參與其他優(yōu)惠,那么我們可以給出下面的類圖,其中SalesMan為京東App:
代碼:
首先定義京東App類,即上面的SalesMan類:
public class JDApp {
private Strategy strategy;
public double payment(Strategy strategy,double total){
return strategy.calculatePrice(total);
}
}
接著定義策略接口,具體的策略實現(xiàn)該接口即可,三種策略實現(xiàn)如下:
public interface Strategy {
double calculatePrice(double total);
}
public class StrategyA implements Strategy{
@Override
public double calculatePrice(double total) {
// 總價打九折
System.out.println("策略A:總價打九折");
return total*0.90;
}
}
public class StrategyB implements Strategy{
@Override
public double calculatePrice(double total) {
// 每滿300減30,每滿1000減200
System.out.println("策略B:每滿300減30,每滿1000減200");
int numK = (int)total / 1000;
int num300 = (int)(total-numK*1000) / 300;
total = total - numK*200 - num300*30;
return total;
}
}
public class StrategyC implements Strategy {
@Override
public double calculatePrice(double total) {
// 3000減600 優(yōu)惠券一張,不與參與其他優(yōu)惠
System.out.println("策略C:3000減600大額優(yōu)惠券一張,不與參與其他優(yōu)惠");
if(total>=3000){
return total-600;
}else {
return total;
}
}
}
最后,在客戶端使用不同的策略,如下:
public class Main {
public static void main(String[] args) {
double total = 3200;
JDApp jdApp = new JDApp();
double straA = jdApp.payment(new StrategyA(), total);
System.out.println(straA);
double straB = jdApp.payment(new StrategyB(), total);
System.out.println(straB);
double straC = jdApp.payment(new StrategyC(), total);
System.out.println(straC);
}
}
輸出結果:
策略A:總價打九折
2880.0
策略B:每滿300減30,每滿1000減200
2600.0
策略C:3000減600大額優(yōu)惠券一張,不與參與其他優(yōu)惠
2600.0
優(yōu)點
-
策略類之間可以自由切換
由于策略類都實現(xiàn)同一個接口,所以使它們之間可以自由切換。
-
易于擴展
增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼,符合“開閉原則“文章來源:http://www.zghlxwxcb.cn/news/detail-816721.html
-
避免使用多重條件選擇語句(if else),充分體現(xiàn)面向對象設計思想。文章來源地址http://www.zghlxwxcb.cn/news/detail-816721.html
缺點
- 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
- 策略模式將造成產生很多策略類,可以通過使用享元模式在一定程度上減少對象的數量。
使用場景
- 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種時,可將每個算法封裝到策略類中。
- 一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn),可將每個條件分支移入它們各自的策略類中以代替這些條件語句。
- 系統(tǒng)中各算法彼此完全獨立,且要求對客戶隱藏具體算法的實現(xiàn)細節(jié)時。
- 系統(tǒng)要求使用算法的客戶不應該知道其操作的數據時,可使用策略模式來隱藏與算法相關的數據結構。
- 多個類只區(qū)別在表現(xiàn)行為不同,可以使用策略模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。
到了這里,關于行為型設計模式——策略模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!