策略模式:
1.策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。需要的時候可以靈活地調用方法,也可以對方法(策略)進行修改,客戶端調用方法時不需要知道這個方法是怎樣實現的。
2.策略模式區別於訪問者模式,解釋器模式,狀態模式。
訪問者模式裏面兩個對象(訪問者與被訪者)之間有相互調用函數,增加一個訪問者會比較困難(要連同被訪者的幾個重載函數一起創建,在被訪者類裏面也要增加相應的函數),在策略模式裏面只要增加一個策略類(並implements Strategy)就可以了。
解釋器模式裏面,如四則運算,加法只是解決問題所用到的一條語句,解釋器模式根據問題將算法和參與運算的值組合成一個樹型結構,非葉子節點(NonterminalExpression)爲算法,葉子節點(TerminalExpression)爲參與運算的值,最後通過遍歷這顆樹求得問題的解
狀態模式和策略模式非常相似,將“策略”的切換部分或全部交由“策略”自己處理,這就是狀態模式。
Context:環境類,客戶端通過它來調用策略方法
Strategy:策略接口
Concrete StategyA/B/C:具體策略類
3.例子,調用3個方法(策略)
策略類接口,策略方法operate()
package pers.reus.model.strategy.impl;
//策略類接口
public interface Strategy {
public void operate();
}
三個方法A,B,C
package pers.reus.model.strategy;
import pers.reus.model.strategy.impl.Strategy;
public class StrategyA implements Strategy{
public void operate() {
System.out.println("使用策略A");
}
}
package pers.reus.model.strategy;
import pers.reus.model.strategy.impl.Strategy;
public class StrategyB implements Strategy{
public void operate() {
System.out.println("使用策略B");
}
}
package pers.reus.model.strategy;
import pers.reus.model.strategy.impl.Strategy;
public class StrategyC implements Strategy{
public void operate() {
System.out.println("使用策略C");
}
}
環境類Context。
package pers.reus.model.context;
import pers.reus.model.strategy.impl.Strategy;
//環境類
public class StrategyPatternContext {
private Strategy strategy;
//構造函數,通過傳參判斷要使用哪個方法
public StrategyPatternContext(Strategy strategy){
this.strategy = strategy;
}
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
測試:
package pers.reus.model.client;
import pers.reus.model.context.StrategyPatternContext;
import pers.reus.model.strategy.StrategyA;
import pers.reus.model.strategy.StrategyB;
import pers.reus.model.strategy.StrategyC;
public class StrategyPatternClient {
public static void main(String[] args) {
//聲明Context
StrategyPatternContext context;
//講A,B,C三個策略分別放入Context
context = new StrategyPatternContext(new StrategyA());
context.operate();
context = new StrategyPatternContext(new StrategyB());
context.operate();
context = new StrategyPatternContext(new StrategyC());
context.operate();
}
}
結果:
使用策略A
使用策略B
使用策略C