簡介
策略模式,又叫算法簇模式,就是定義了不同的算法族,並且之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。
實現
策略設計模式由以下幾個部分組成
- 封裝類:也叫上下文,對策略進行二次封裝,目的是避免高層模塊對策略的直接調用。
- 抽象策略:通常情況下爲一個接口,當各個實現類中存在着重複的邏輯時,則使用抽象類來封裝這
部分公共的代碼,此時,策略模式看上去更像是模版方法模式。 - 具體策略:具體策略角色通常由一組封裝了算法的類來擔任,這些類之間可以根據需要自由替換。
假設有這樣一個需求
商店購物:
- 青銅會員打九五折
- 白銀會員打九折
- 白金會員打八折
- 我們先寫抽象策略
public interface Strategy {
double getPrice(double standardPrice);
}
- 三種具體策略
/**
* 青銅用戶
* @author guxiang
* @date 2017-2-23 下午8:09:56
*/
public class BronzeMember implements Strategy {
public double getPrice(double standardPrice) {
System.out.println("九五折");
return standardPrice*0.95;
}
}
/**
* 白銀用戶
* @author guxiang
* @date 2017-2-23 下午8:10:57
*/
public class SilverMember implements Strategy {
public double getPrice(double standardPrice) {
System.out.println("九折");
return standardPrice*0.9;
}
}
/**
* 白金用戶
* @author guxiang
* @date 2017-2-23 下午8:10:23
*/
public class PlatinoMember implements Strategy{
public double getPrice(double standardPrice) {
System.out.println("八折");
return standardPrice*0.8;
}
}
- 封裝類(上下文類)
/**
* context負責具體與策略類的交互
* 在spring中的依賴注入功能,可以通過配置文件,動態注入策略對象
* @author guxiang
* @date 2017-2-23 下午8:53:57
*/
public class Context {
private Strategy strategy;
//構造注入
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
//set方法注入
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void getFinallyPrice( double standardPrice) {
System.out.println("報價是"+strategy.getPrice(standardPrice));
}
}
策略模式的本質其實就是 分離算法,選擇實現
- JAVASE中的GUI編程就中的佈局管理器是最常用的策略模式,Flow佈局,Border佈局,Card佈局
- Spring框架中,Resource接口,實現的資源訪問策略