策略模式做爲一種軟件設計模式,指對象有某個行爲,可是在不一樣的場景中,該行爲有不一樣的實現算法。好比每一個人都要「交我的所得稅」,可是「在美國交我的所得稅」和「在中國交我的所得稅」就有不一樣的算稅方法。java
策略模式(Strategy),定義了一組算法,將每一個算法都封裝起來,而且使它們之間能夠互換。算法
UML結構圖以下:設計模式
其中,Context是上下文,維護了一個對Strategy對象的引用;Strategy是策略類,用於定義全部支持算法的公共接口;ConcreteStrategy是具體策略類,封裝了具體的算法或行爲,繼承於Strategy。ide
Context上下文角色,也叫Context封裝角色,起承上啓下的做用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。工具
public class Context { Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } //上下文接口 public void contextInterface() { strategy.algorithmInterface(); } }
抽象策略角色,是對策略、算法家族的抽象,一般爲接口,定義每一個策略或算法必須具備的方法和屬性。algorithm是「運算法則」的意思。測試
public abstract class Strategy { //算法方法 public abstract void algorithmInterface(); }
用於實現抽象策略中的操做,即實現具體的算法,下方用print代替。測試類共3個ConcreteStrategy,其它兩個類與ConcreteStrategyA同理,就再也不贅述了。this
public class ConcreteStrategyA extends Strategy { @Override public void algorithmInterface() { System.out.println("算法A實現"); } }
下面依次更換策略,測試一下策略模式。設計
public class Client { public static void main(String[] args) { Context context; context = new Context(new ConcreteStrategyA()); context.contextInterface(); context = new Context(new ConcreteStrategyB()); context.contextInterface(); context = new Context(new ConcreteStrategyC()); context.contextInterface(); } } /**測試結果 算法A實現 算法B實現 算法C實現 */
應用場景code
優勢:對象
缺點:
咱們來模擬一個下班回家的場景,須要本身選擇不一樣的交通工具來回家
首先聲明一個TravelContext對象,經過構造方法,傳入具體的交通工具。
public class TravelContext { private Vehicle vehicle; public TravelContext(Vehicle vehicle){ this.vehicle = vehicle; } public void goHome(){ if (vehicle!=null){ vehicle.travel(); } } }
public interface Vehicle { void travel(); }
public class Bus implements Vehicle { public void travel() { System.out.println("乘坐巴士"); } } public class Car implements Vehicle { public void travel() { System.out.println("乘坐小汽車"); } } public class Taxi implements Vehicle { public void travel() { System.out.println("乘坐出租車"); } }
下面寫一個簡單的程序測試一下上方編寫的代碼。
public class Client { public static void main(String[] args) { TravelContext travelContext = null; System.out.println("請選擇回家乘坐的交通工具:1.小汽車 2.出租車 3.巴士"); Scanner scanner = new Scanner(System.in); int input = scanner.nextInt(); switch (input){ case 1: travelContext = new TravelContext(new Car()); travelContext.goHome(); break; case 2: travelContext = new TravelContext(new Taxi()); travelContext.goHome(); break; case 3: travelContext = new TravelContext(new Bus()); travelContext.goHome(); break; default: System.out.println("請輸入1/2/3"); break; } } } /**測試結果 請選擇回家乘坐的交通工具:1.小汽車 2.出租車 3.巴士 3 乘坐巴士 */