策略模式
概念:
策略模式就是定義不同的算法,或者說不同的情況並且將不同的行爲方式封裝起來,根據不同的情況來使用不同的算法或者行爲,當然,前提是結果都是一致的。
官方的說法是:
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變換。
我們先從例子說起吧,其實很簡單:我們平時在做算法的時候會想到很多情況,比如說數值,返回值不同,使用不同的算法,用一個if else判斷,或者swich判斷,進行不同的算法,這裏,從一個生活的實例說起吧:
我們出門旅遊。有三種不同的算法(方式),步行,飛機,火車
//旅遊策略類
public class TravelStrategy {
//枚舉中定義了三種不同的算法常量
enum Strategy{
//步行,飛機,火車
WALK,PLANE,SUBWAY
}
private Strategy strategy;
public TravelStrategy(Strategy strategy){
this.strategy=strategy;
}
//旅遊方法
public void travel(){
//判斷方式分別進行操作
if(strategy==Strategy.WALK){
print(walk);
}else if(strategy==Strategy.PLANE){
print(plane);
}else if(strategy==Strategy.SUBWAY){
print(subway);
}
}
public void print(String str){
System.out.println(出行旅遊的方式爲:+str);
}
public static void main(String[] args) {
//調用方法
TravelStrategy walk=new TravelStrategy(Strategy.WALK);
walk.travel();
TravelStrategy plane=new TravelStrategy(Strategy.PLANE);
plane.travel();
TravelStrategy subway=new TravelStrategy(Strategy.SUBWAY);
subway.travel();
}
}
這些都是正常思維方式下我們平時使用的方式。但是這樣做有一個致命的缺點,一旦出行的方式要增加,我們就不得不增加新的else if語句,而這違反了面向對象的原則之一,對修改封閉。而這時候,策略模式則可以完美的解決這一切。
那麼用策略模式如何去做呢??
步驟:(分四步):
1,創建旅遊接口,定義旅遊方法
2,創建不同的實現類,實現接口,
3,創建策略包裝類,實現包裝
4,方法的調用
接口
public interface Strategy {
void travel();
}
實現類:1,2,3
public class WalkStrategy implements Strategy{
@Override
public void travel() {
System.out.println(walk);
}
}
public class PlaneStrategy implements Strategy{
@Override
public void travel() {
System.out.println(plane);
}
}
public class SubwayStrategy implements Strategy{
@Override
public void travel() {
System.out.println(subway);
}
}
包裝類
public class TravelContext { Strategy strategy;
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void travel() {
if (strategy != null) {
strategy.travel();
}
}
}
調用:
public class Main { public static void main(String[] args) {
TravelContext travelContext=new TravelContext();
travelContext.setStrategy(new PlaneStrategy());
travelContext.travel();
travelContext.setStrategy(new WalkStrategy());
travelContext.travel();
travelContext.setStrategy(new SubwayStrategy());
travelContext.travel();
}
}
這樣,如果以後只要增加了旅遊的方式,只需要增加實現類就可以了,符合面向對象的思想