【設計模式】(二十三)–行爲型模式–策略模式
策略模式定義
Define a family of algorithms, encapsulate each one, and make them interchangeable.
意思是:定義一組算法,將每個算法都封裝起來,並且使他們之間可以互換。
策略模式通常有三個元素:
- Strategy 抽象策略,對策略算反進行抽象,通常定義每個策略或算法都必須具有的方法和屬性。
- ConcreteStrategy 具體策略,實現抽象策略中的具體操作的類,含有具體的算法。
- Context 環境,運行特定策略的類,也叫作上下文,屏蔽高層模塊對策略、算法的直接訪問,持有一個Strategy類的引用。
策略模式的優點
- 1、算法可以自由切換。
- 2、避免使用多重條件判斷。
- 3、擴展性良好。
策略模式還有以下缺點
- 1、策略類會增多。 每一種算法都封裝到每一個具體策略實現中。
- 2、所有策略類都需要對外暴露。所以調用者需要知道所有的策略類, 並且自行選擇所需要的具體策略類。
策略模式的使用場景
- 1、如果在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式可以動態地讓一個對象在許多行爲中選擇一種行爲。
- 2、一個系統需要動態地在幾種算法中選擇一種。
- 3、如果一個對象有很多的行爲,如果不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。
策略模式的簡單實現
類圖
實現
public class Context {
private Strategy strategy;
public int execute(int count) {
return strategy.doCalculate(count);
}
public static void main(String[] args) {
Strategy buy1Get1Free = new Buy1Get1FreeStrategy();
Strategy a20Percent = new TwentyPercentDiscountStrategy();
Context context = new Context();
System.out.println("購買2杯奶茶,現在有兩種策略");
context.setStrategy(buy1Get1Free);
context.execute(1);
context.setStrategy(a20Percent);
context.execute(2);
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
public interface Strategy {
int PRICE = 20;
int doCalculate(int count);
}
/**
* 買一送一活動
*/
public class Buy1Get1FreeStrategy implements Strategy {
@Override
public int doCalculate(int count) {
int total = count * PRICE;
System.out.println("使用買一送一活動,買了+" + count + "杯480ml的奶茶,送一杯360ml奶茶,共計:" + total);
return total;
}
}
/**
* 8折優惠活動
*/
public class TwentyPercentDiscountStrategy implements Strategy {
@Override
public int doCalculate(int count) {
int total = count * PRICE * 80 / 100;
System.out.println("使用八折優惠策略,購買" + count + "杯480ml奶茶,總共" + total);
return total;
}
}
結果