一、策略模式
概述
在策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式
在策略模式中,我們創(chuàng)建表示各種策略的對(duì)象和一個(gè)行為隨著策略對(duì)象改變而改變的 context 對(duì)象。策略對(duì)象改變 context 對(duì)象的執(zhí)行算法
主要解決:在有多種算法相似的情況下,使用 if…else 所帶來(lái)的復(fù)雜和難以維護(hù)
何時(shí)使用:一個(gè)系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為
策略模式一般用于各種算法上面
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、算法可以自由切換
2、避免使用多重條件判斷
3、擴(kuò)展性良好
缺點(diǎn):
1、策略類會(huì)增多
2、所有策略類都需要對(duì)外暴露
1. 各個(gè)角色介紹
1.1 策略類(Strategy)
策略是一個(gè)接口,該接口定義若干個(gè)操作標(biāo)識(shí),即定義了若干個(gè)方法
1.2 環(huán)境類 / 策略上下文類(Context)
上下文是依賴于接口的類(是面向策略設(shè)計(jì)的類,如下圖 Context 類),即上下文包含用策略(接口)聲明的變量(如下圖的strategy成員變量)
上下文提供一個(gè)方法(如下圖Context類中的的 executeStrategy() 方法),持有一個(gè)策略類的引用,最終給客戶端調(diào)用。該方法委托策略變量調(diào)用具體策略所實(shí)現(xiàn)的策略接口中的方法(實(shí)現(xiàn)接口的類重寫策略中的方法,來(lái)完成具體功能)
1.3 具體策略類(ConcreteStrategy)
具體策略是實(shí)現(xiàn)策略接口的類(如下圖的ConcreteStrategyA類和ConcreteStrategyB類)。具體策略實(shí)現(xiàn)策略接口所定義的方法,即給出操作標(biāo)識(shí)的具體方法
2. UML圖
3. 具體例子和代碼
角色分配
- Strategy:策略接口
- OperationAdd:加法策略(實(shí)現(xiàn)策略接口)
- OperationSubtract:減法策略(實(shí)現(xiàn)策略接口)
- OperationMultiply:乘法策略(實(shí)現(xiàn)策略接口)
- OperationDivision:除法策略(實(shí)現(xiàn)策略接口)
- Context:策略上下文
3.1 策略接口以及實(shí)現(xiàn)類
- Strategy
package com.vinjcent.pattern.strategy;
/**
* @author vinjcent
* @description 策略接口
*/
public interface Strategy {
/**
* 實(shí)現(xiàn)該接口的方法
* @param num1 數(shù)值1
* @param num2 數(shù)值2
* @return 計(jì)算結(jié)果
*/
int doOperation(int num1, int num2);
}
- OperationAdd
package com.vinjcent.pattern.strategy;
/**
* @author vinjcent
* @description 加法策略
*/
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
- OperationSubtract
package com.vinjcent.pattern.strategy;
/**
* @author vinjcent
* @description 減法策略
*/
public class OperationSubtract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
- OperationMultiply
package com.vinjcent.pattern.strategy;
/**
* @author vinjcent
* @description 乘法策略
*/
public class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
- OperationDivision
package com.vinjcent.pattern.strategy;
/**
* @author vinjcent
* @description 除法策略
*/
public class OperationDivision implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 / num2;
}
}
3.2 策略上下文類
- Context
package com.vinjcent.pattern.strategy;
/**
* @author vinjcent
* @description 策略上下文
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
3.3 測(cè)試主函數(shù)
package com.vinjcent.pattern.strategy;
/**
* @author vinjcent
*/
public class Main {
public static void main(String[] args) {
// 策略上下文
Context context = new Context(new OperationAdd());
// 加法策略
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
// 減法策略
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
// 乘法策略
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
// 除法策略
context = new Context(new OperationDivision());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
- 測(cè)試結(jié)果
4. 使用場(chǎng)景
- 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種
- 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J剑@些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)
注意事項(xiàng):
如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式,解決策略類膨脹的問(wèn)題文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-720297.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-720297.html
到了這里,關(guān)于Java特性之設(shè)計(jì)模式【策略模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!