策略模式對應於解決某一個問題的一個算法族,容許用戶從該算法族中任選一種算法解決一個問題,同時能夠方便的更換算法或者增長新的算法。而且由客戶端決定調用哪一個算法。算法
策略模式的本質:spring
分離算法,選擇實現。ide
某公司市場部在接單時根據不一樣的客戶進行報價,能夠劃分爲如下幾種類型:測試
(1)新客戶小批量報價this
(2)新客戶大批量報價spa
(3)老客戶小批量報價code
(4)老客戶大批量報價對象
當遇到這種狀況時,能夠採用策略模式實現。blog
1 /** 2 * 普通方式實現報價 3 * @author CL 4 * 5 */ 6 public class TestStrategy { 7 8 public double getPrice(String type, double price) { 9 if (type.equals("新客戶小批量")) { 10 System.out.println("不打折!"); 11 return price; 12 } 13 14 if (type.equals("新客戶大批量")) { 15 System.out.println("打九折!"); 16 return price * 0.9; 17 } 18 19 if (type.equals("老客戶小批量")) { 20 System.out.println("打八五折!"); 21 return price * 0.85; 22 } 23 24 if (type.equals("老客戶大批量")) { 25 System.out.println("打八折!"); 26 return price * 0.8; 27 } 28 29 return price; 30 } 31 32 public static void main(String[] args) { 33 TestStrategy strategy = new TestStrategy(); 34 35 System.out.printf("您該報價:%6.2f", strategy.getPrice("老客戶小批量", 998)); 36 37 System.out.println("\n---------------------------"); 38 39 System.out.printf("您該報價:%6.2f", strategy.getPrice("新客戶大批量", 1024)); 40 } 41 42 }
控制檯輸出:開發
打八五折! 您該報價:848.30 --------------------------- 打九折! 您該報價:921.60
注意:實現起來很容易,符號通常開發人員的思路。可是,假如類型不少,算法比較複雜時,整個條件語句的代碼就變得很長,難於維護。若是有新增類型,就須要頻繁的修改代碼。
不符合開閉原則!
1 /** 2 * 策略模式 3 * @author CL 4 * 5 */ 6 public interface Strategy { 7 8 public double getPrice(double originalCost); 9 10 }
1 /** 2 * 新客戶小批量 3 * @author CL 4 * 5 */ 6 public class NewCustomerFewStrategy implements Strategy { 7 8 @Override 9 public double getPrice(double originalCost) { 10 System.out.println("不打折!"); 11 return originalCost; 12 } 13 14 }
1 /** 2 * 新客戶大批量 3 * @author CL 4 * 5 */ 6 public class NewCustomerManyStrategy implements Strategy { 7 8 @Override 9 public double getPrice(double originalCost) { 10 System.out.println("打九折!"); 11 return originalCost * 0.9; 12 } 13 14 }
1 /** 2 * 老客戶小批量 3 * @author CL 4 * 5 */ 6 public class OldCustomerFewStrategy implements Strategy { 7 8 @Override 9 public double getPrice(double originalCost) { 10 System.out.println("打八五折!"); 11 return originalCost * 0.85; 12 } 13 14 }
1 /** 2 * 老客戶大批量 3 * @author CL 4 * 5 */ 6 public class OldCustomerManyStrategy implements Strategy { 7 8 @Override 9 public double getPrice(double originalCost) { 10 System.out.println("打八折!"); 11 return originalCost * 0.8; 12 } 13 14 }
1 /** 2 * 負責和具體的策略類交互 3 * 使策略模式,使具體的算法和直接的客戶調用分離,使算法能夠獨立於客戶端進行獨立變化。 4 * 能夠經過構造器注入策略對象的引用,也能夠經過set方法注入策略對象的引用。 5 * 若是使用spring的依賴注入功能,還能夠經過配置文件,動態地注入不一樣的策略對象,動態的切換不一樣的算法。 6 * @author CL 7 * 8 */ 9 public class Context { 10 11 private Strategy strategy; 12 13 //經過構造器注入 14 public Context(Strategy strategy) { 15 this.strategy = strategy; 16 } 17 18 //經過set方法注入 19 public void setStrategy(Strategy strategy) { 20 this.strategy = strategy; 21 } 22 23 public void printPrice(double originalCost) { 24 System.out.printf("您該報價:%6.2f", strategy.getPrice(originalCost)); 25 } 26 27 }
測試:
1 /** 2 * 測試策略模式 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 Strategy strategy = new OldCustomerFewStrategy(); //老客戶小批量 10 Context context = new Context(strategy); 11 12 context.printPrice(998); 13 14 System.out.println("\n---------------------------"); 15 16 Strategy strategy2 = new NewCustomerManyStrategy(); //新客戶大批量 17 Context context2 = new Context(strategy2); 18 19 context2.printPrice(1024); 20 21 } 22 }
控制檯輸出:
打八五折! 您該報價:848.30 --------------------------- 打九折! 您該報價:921.60
(1)市場系統中的報價功能;
(2)醫保系統中根據不一樣的人繳納不一樣的保險費用;
(3)…………