GOF23設計模式之策略模式(strategy)

1、策略模式概述

  策略模式對應於解決某一個問題的一個算法族,容許用戶從該算法族中任選一種算法解決一個問題,同時能夠方便的更換算法或者增長新的算法。而且由客戶端決定調用哪一個算法。算法

  策略模式的本質:spring

    分離算法,選擇實現。ide

2、策略模式場景導入

  某公司市場部在接單時根據不一樣的客戶進行報價,能夠劃分爲如下幾種類型:測試

    (1)新客戶小批量報價this

    (2)新客戶大批量報價spa

    (3)老客戶小批量報價code

    (4)老客戶大批量報價對象

  當遇到這種狀況時,能夠採用策略模式實現。blog

3、使用普通方式實現報價操做

 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

  注意:實現起來很容易,符號通常開發人員的思路。可是,假如類型不少,算法比較複雜時,整個條件語句的代碼就變得很長,難於維護。若是有新增類型,就須要頻繁的修改代碼。

       不符合開閉原則!

4、使用策略模式實現報價操做

 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

5、策略模式常見開發應用場景

  (1)市場系統中的報價功能;

  (2)醫保系統中根據不一樣的人繳納不一樣的保險費用;

  (3)…………

相關文章
相關標籤/搜索