動(dòng)機(jī)
- 在軟件構(gòu)建過(guò)程中,某些對(duì)象使用的算法可能多種多樣,經(jīng)常改變,如果將這些算法都編碼到對(duì)象中,會(huì)使對(duì)象變得異常復(fù)雜.
- 在運(yùn)行時(shí)根據(jù)需要透明地改變對(duì)象的算法,將算法與對(duì)象本身解耦
定義
定義一系列算法,把他們一個(gè)個(gè)封裝起來(lái),使它們可以相互替換,該模式使得算法可獨(dú)立于使用它的客戶程序而變化
要點(diǎn)
- Strategy 及其子類為組件提供一系列可重用的算法,從而可以使得類型在
運(yùn)行時(shí)
方便地根據(jù)需要在各個(gè)算法之間切換 - Strategy模式提供了用
條件判斷
語(yǔ)句外的選擇,消除條件判斷
語(yǔ)句,就是在解耦合.含有許多條件判斷語(yǔ)句的代碼通常都可以使用Strategy模式 - 如果Strategy對(duì)象沒(méi)有實(shí)例變量,那么各個(gè)上下文可以共享同一個(gè)Strategy對(duì)象,從而降低對(duì)象實(shí)例化數(shù)量
不適用的場(chǎng)景
- if-else判斷都是確認(rèn)不會(huì)改變的.例如一周7天
示例
各國(guó)的稅收算法不一樣,通過(guò)Strategy模式
替換掉if-else
/**
* 抽象的稅收方法
*
* @author roger
* @date 2019/8/21
*/
public abstract class TaxStrategy {
/**
* 計(jì)算稅
*
* @param incoming 收入
* @return
*/
protected abstract double calculateTax(double incoming);
}
/**
* China稅收計(jì)算方式
* @author roger
* @date 2019/8/21
*/
public class ChinaTaxStrategy extends TaxStrategy {
@Override
protected double calculateTax(double incoming) {
return Math.max((incoming - 10000) * 0.05,0);
}
}
/**
* 日本稅收
* @author roger
* @date 2019/8/21
*/
public class JapanTaxStrategy extends TaxStrategy {
/**
* 計(jì)算稅
*
* @param incoming 收入
* @return
*/
@Override
protected double calculateTax(double incoming) {
return Math.max((incoming * 0.03) - 500, 0);
}
}
/**
* 美國(guó)稅收
* @author roger
* @date 2019/8/21
*/
public class USTaxStrategy extends TaxStrategy {
/**
* 計(jì)算稅
*
* @param incoming 收入
* @return
*/
@Override
protected double calculateTax(double incoming) {
return incoming * 0.05;
}
}
public static void main(String[] args) {
TaxStrategy strategy = new ChinaTaxStrategy();
double tax = strategy.calculateTax(20000);
}