策略模式概念
策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換,策略模式讓算法獨立于使用它的客戶而獨立變化。策略模式使這些算法在客戶端調(diào)用它們的時候能夠互不影響地變化。
策略模式的意義
策略模式使開發(fā)人員能夠開發(fā)出由許多可替換的部分組成的軟件,并且各個部分之間是低耦合的關(guān)系。低耦合的特性使軟件具有更強(qiáng)的可擴(kuò)展性,易于維護(hù);更重要的是,它大大提高了軟件的可重用性。
策略模式中有三個對象
環(huán)境對象(Context):該類中實現(xiàn)了對抽象策略中定義的接口或者抽象類的引用。
抽象策略對象(Strategy):它可由接口或抽象類來實現(xiàn)。
具體策略對象(ConcreteStrategy):它封裝了實現(xiàn)同不功能的不同算法。
模型圖

策略模式的實現(xiàn)
1.對策略對象定義一個公共接口。
2.編寫策略類,該類實現(xiàn)了上面的公共接口。
3.在使用策略對象的類中保存一個對策略對象的引用。
4.在使用策略對象的類中,實現(xiàn)對策略對象的set和get方法或者使用構(gòu)造方法完成賦值。
具體代碼實現(xiàn)
定義一個接口( 抽象策略),定義一個方法用于對兩個整數(shù)進(jìn)行運(yùn)算
public interface Strategy {
public abstract int calculate(int a, int b);
}
定義具體的算法類,實現(xiàn)兩個整數(shù)的加減乘除運(yùn)算,但是外部調(diào)用形式需要符合接口的定義
實現(xiàn)加法運(yùn)算
public class AddStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
實現(xiàn)減法運(yùn)算
public class SubstractStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
定義具體的環(huán)境角色,持有Strategy接口的引用,并且有g(shù)et和set方法可以完成策略更換。在環(huán)境角色中調(diào)用接口的方法完成動作。
public class StrategyContext {
private Strategy strategy;
public StrategyContext(Strategy strategy) {
super();
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calculate(int a, int b) {
return strategy.calculate(a, b);
}
}
這樣在調(diào)用時,只需向環(huán)境角色設(shè)置相應(yīng)的算法類,然后就可以得到相應(yīng)的結(jié)果。
//加法
StrategyContext context = new StrategyContext(new AddStrategy());
System.out.println(context.calculate(10, 5));
//減法
StrategyContext context2 = new StrategyContext(new SubstractStrategy());
System.out.println(context2.calculate(3, 2));
策略模式的缺點
1、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當(dāng)?shù)乃惴悺?換言之,策略模式 只適用于 客戶端知道 所有的算法或行為的情況。
2、策略模式造成很多的策略類,每個具體策略類都會產(chǎn)生一個新類。
有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計成可共享的,這樣策略類實例可以 被不同 客戶端 使用。換言之,可以使用 享元模式 來減少對象的數(shù)量。