策略模式

壹頁書 發表於 2017-03-21

策略模式的定義和使用場景

定義:策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使他們可以相互替換,讓演算法獨立於使用它的客戶而獨立變化。

分析下定義,策略模式定義和封裝了一系列的演算法,它們是可以相互替換的,也就是說它們具有共性,而它們的共性就體現在策略介面的行為上,另外為了達到最後一句話的目的,也就是說讓演算法獨立於使用它的客戶而獨立變化,我們需要讓客戶端依賴於策略介面。

策略模式的使用場景:

1.針對同一型別問題的多種處理方式,僅僅是具體行為有差別時;
2.需要安全地封裝多種同一型別的操作時;
3.出現同一抽象類有多個子類,而又需要使用 if-else 或者 switch-case 來選擇具體子類時。

策略模式例子

出行旅遊:我們可以有幾個策略可以考慮:可以騎自行車,汽車,做火車,飛機。每個策略都可以得到相同的結果,但是它們使用了不同的資源。選擇策略的依據是費用,時間,使用工具還有每種方式的方便程度 。

1336731431_2462

具體的java程式碼實現

1336733743_7225

定義一個person類

package org.java.base.pattern.strategy;

public class StrategyPatternDemo {

 public static void main(String[] args) {
 Person person = new Person(new BicycleStrategy());
 person.travel();
 person.setStrategy(new AirPlanelStrategy());
 person.travel();
 person.setStrategy(new TrainStrategy());
 person.travel();
 
 }

}複製程式碼

定義旅行的介面類

package org.java.base.pattern.strategy;

public interface TravelStrategy {
 public void travel();
}複製程式碼

實現具體的旅行方式-火車

package org.java.base.pattern.strategy;

public class TrainStrategy implements TravelStrategy {

 @Override
 public void travel() {
 System.out.println("坐火車去旅行");
 }

}複製程式碼

實現具體的旅行方式-飛機

package org.java.base.pattern.strategy;

public class AirPlanelStrategy implements TravelStrategy {

 @Override
 public void travel() {
 System.out.println("坐飛機去旅遊");
 }

}複製程式碼

實現具體的旅行方式-自行車

package org.java.base.pattern.strategy;

public class BicycleStrategy implements TravelStrategy {

 @Override
 public void travel() {
 System.out.println("騎自行去旅行");
 }

}複製程式碼

測試類

package org.java.base.pattern.strategy;

public class StrategyPatternDemo {

 public static void main(String[] args) {
 Person person = new Person(new BicycleStrategy());
 person.travel();
 person.setStrategy(new AirPlanelStrategy());
 person.travel();
 person.setStrategy(new TrainStrategy());
 person.travel();
 
 }

}複製程式碼

最後列印結果

騎自行去旅行
坐飛機去旅遊
坐火車去旅行複製程式碼

策略模式