1. 策略模式簡(jiǎn)介
策略模式: 策略模式是一種行為型模式, 它將對(duì)象和行為分開, 將行為定義為一個(gè)行為接口和具體行為的實(shí)現(xiàn) 策略模式最大的特點(diǎn)是行為的變化, 行為之間可以相互替換 每個(gè)if判斷都可以理解為一個(gè)策略. 本模式是的算法可獨(dú)立于使用它的用戶而變化
2. 模式結(jié)構(gòu)
策略模式包括如下角色:
- Strategy: 抽象策略類: 策略是一個(gè)接口,? 該接口定義若干個(gè)算法標(biāo)識(shí), 即定義了若干個(gè)抽象方法(入下圖algorithm())
- Context: 上下文類:
? ? ? ? 1. 上下文依賴于接口的類(是面向策略設(shè)計(jì)的類, 如下圖Context類), 即上下文包含用策略聲? ? ? ? ????????? 明的變量(如下圖的strategy成員變量)
? ? ? ? 2. 上下文提供一個(gè)方法(如下圖Context類中的lookAlrorithm()方法), 持有一個(gè)策略類的引用,? ? ? ? ? ? ? 最終給客戶端嗲用, 該方法委托策略變量調(diào)用具體策略所實(shí)現(xiàn)的策略接口中的方法(實(shí)現(xiàn)接口? ? ? ? ? ??的類重寫策略(接口)中的方法, 來完成具體的功能)
- ConcreteStategy: 具體策略類: 具體策略是實(shí)現(xiàn)策略接口的類(如下圖中的ConcreteStrategyA類和ConcreteStrategyB類) 具體策略實(shí)現(xiàn)策略接口所定義的方法, 即給出算法標(biāo)識(shí)的具體方法(說白了就是重寫策略類的方法)
?3. 案例
?1)傳統(tǒng)模式實(shí)現(xiàn)
public Double calculationPrice(String type, Double originalPrice, int n) {
//中級(jí)會(huì)員計(jì)費(fèi)
if (type.equals("intermediateMember")) {
return originalPrice * n - originalPrice * 0.1;
}
//高級(jí)會(huì)員計(jì)費(fèi)
if (type.equals("advancePrimaryMember")) {
return originalPrice * n - originalPrice * 0.2;
}
//普通會(huì)員計(jì)費(fèi)
return originalPrice;
}
傳統(tǒng)的實(shí)現(xiàn)方式, 通過傳統(tǒng)if代碼判斷, 這樣就會(huì)導(dǎo)致后期維護(hù)性很差, 當(dāng)后期需要新增計(jì)費(fèi)方式, 還需要在這里再加上if(), 也不符合設(shè)計(jì)模式的開閉原則
2)策略模式的實(shí)現(xiàn)
抽象類策略
public interface MemberStrategy {
// 一個(gè)計(jì)算價(jià)格的抽象方法
//price商品的價(jià)格 n商品的個(gè)數(shù)
public double calcPrice(double price, int n);
}
具體實(shí)現(xiàn)類
// 普通會(huì)員——不打折
public class PrimaryMemberStrategy implements MemberStrategy { // 實(shí)現(xiàn)策略
//重寫策略方法具體實(shí)現(xiàn)功能
@Override
public double calcPrice(double price, int n) {
return price * n;
}
}
// 中級(jí)會(huì)員 打百分之10的折扣
public class IntermediateMemberStrategy implements MemberStrategy{
@Override
public double calcPrice(double price, int n) {
double money = (price * n) - price * n * 0.1;
return money;
}
}
/ 高級(jí)會(huì)員類 20%折扣
public class AdvanceMemberStrategy implements MemberStrategy{
@Override
public double calcPrice(double price, int n) {
double money = price * n - price * n * 0.2;
return money;
}
}
上下文類
也叫上下文或者環(huán)境類, 承上啟下的作用
/**
* 負(fù)責(zé)和具體的策略類交互
* 這樣的話,具體的算法和直接的客戶端調(diào)用分離了,使得算法可以獨(dú)立于客戶端獨(dú)立的變化。
*/
// 上下文類/環(huán)境類
public class MemberContext {
// 用戶折扣策略接口
private MemberStrategy memberStrategy;
// 注入構(gòu)造方法
public MemberContext(MemberStrategy memberStrategy) {
this.memberStrategy = memberStrategy;
}
// 計(jì)算價(jià)格
public double qoutePrice(double goodsPrice, int n){
// 通過接口變量調(diào)用對(duì)應(yīng)的具體策略
return memberStrategy.calcPrice(goodsPrice, n);
}
}
測(cè)試類
// 測(cè)試類
public class Application {
public static void main(String[] args) {
// 具體行為策略
MemberStrategy primaryMemberStrategy = new PrimaryMemberStrategy(); // 接口回調(diào)
MemberStrategy intermediateMemberStrategy = new IntermediateMemberStrategy();
MemberStrategy advanceMemberStrategy = new AdvanceMemberStrategy();
// 用戶選擇不同策略
MemberContext primaryContext = new MemberContext(primaryMemberStrategy);
MemberContext intermediateContext = new MemberContext(intermediateMemberStrategy);
MemberContext advanceContext = new MemberContext(advanceMemberStrategy);
//計(jì)算一本300塊錢的書
System.out.println("普通會(huì)員的價(jià)格:"+ primaryContext.qoutePrice(300,1));//300
System.out.println("中級(jí)會(huì)員的價(jià)格:"+ intermediateContext.qoutePrice(300,1));//270
System.out.println("高級(jí)會(huì)員的價(jià)格:"+ advanceContext.qoutePrice(300,1));//240
}
}
上述案例UML類圖
?4. 策略模式優(yōu)缺點(diǎn)
1)優(yōu)點(diǎn)
- 策略模式提供了不同的實(shí)現(xiàn)方法(算法)
- 策略模式提供了可以替換繼承關(guān)系的辦法
- 使用策略歐式可以避免使用多重條件轉(zhuǎn)移語句
2)缺點(diǎn)
- 客戶端必須知道所有的策略類, 并自行決定使用哪一個(gè)策略類
- 策略模式將造成很多策略類
5.策略模式的應(yīng)用場(chǎng)景
- 如果一個(gè)系統(tǒng)里面有很多類, 它們之間的區(qū)別僅在于它們的行為, 那么使用策略模式可以動(dòng)態(tài)讓一個(gè)對(duì)象在許多行為中選擇一個(gè)行為
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)的在幾種算法中選擇一種
- 不希望客戶端知道復(fù)雜的, 與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu), 提高算法的保密性和安全性
在我們生活中常見的應(yīng)用模式有:
1、電商網(wǎng)站支付方式,一般分為銀聯(lián)、微信、支付寶,可以采用策略模式
2、電商網(wǎng)站活動(dòng)方式,一般分為滿減送、限時(shí)折扣、包郵活動(dòng),拼團(tuán)等可以采用策略模式
6. 總結(jié): 核心思想就是多態(tài)文章來源:http://www.zghlxwxcb.cn/news/detail-501156.html
- 在策略模式中定義了一系列算法, 將每一個(gè)算法封裝起來, 策略模式讓算法獨(dú)立, 隨著使用它的客戶而變化
- 策略模式包含3個(gè)角色: 上下文解決某個(gè)問題時(shí)可以采用多種策略, 在上下文中維護(hù)一個(gè)對(duì)抽象策略類的引用實(shí)例; 抽象策略類為所支持的算法聲明了抽象的方法, 是所有策略類的父類; 具體策略類實(shí)現(xiàn)了在抽象策略類中定義的算法
- 策略模式的使用情況: 在一個(gè)系統(tǒng)中許多類, 它們之間區(qū)別僅在于它們的行為, 使用策略模式可以動(dòng)態(tài)的讓一個(gè)對(duì)象在許多行為中選擇一種行為
???????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-501156.html
到了這里,關(guān)于Java設(shè)計(jì)模式——策略模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!