1. 程式人生 > >策略模式的應用

策略模式的應用

前言

  在春招秋招之時,因為面試中會問到大量的設計模式。所以有去看一些關於設計模式的書籍,部落格,等等。比如秦小波老師寫的《設計模式之禪》。但當時僅限於看,包括現在也僅限於看。有的時候專案中,你都不知道有沒有運用到了設計模式。也許用到了單例模式,但你並不知道如何用的,不知不覺就用到了。

  當時並不知道設計模式怎麼用,僅僅於看。最近畢業了,進公司實習了一週左右。大概都是在看專案程式碼中度過的,其中看到了一處特別熟悉的程式碼。這個程式碼就是策略者模式。寫的非常的優雅,在此記錄一下。

 

策略者模式

  我個人簡單理解,策略這模式就是代替if else的一種模式。

  很簡單的一個例子。比如人,人分為男人,女人,甚至不清楚性別的人。但這三種類型的人,都有不同的行為。那麼我們在描述這些不同行為的時候,一般我們做法就是如下:

1 if (male) {
2    //...
3 } else if (female) {
4    //...
5 } else {
6    //...
7 }

  類似如上。很多個if,else進行巢狀。這樣非常的難看,不優雅。如果我們用策略這模式替換,會怎麼樣。

 

策略者模式例子

  • 第一步定義一個person介面
1 public interface Person {
3     void executeStrategy();
4 }
  • 第二步定義person的繼承類,如男人,女人等等
 1 public class MalePerson implements Person {
 2     public void executeStrategy() {
 3         System.out.println("我是男性");
 4     }
 5 }
 6 
 7 public class FemalePerson implements Person {
 8     public void executeStrategy() {
 9         System.out.println("我是女性");
10     }
11 }
12 
13 public class UnknownPerson implements Person {
14     public void executeStrategy() {
15         System.out.println("未知性別");
16     }
17 }
  • 第三步定義一個enum類,表示可選擇性。
 1 @Getter
 2 public enum SexEnum {
 3     MALE("male", "男性"),
 4     FEMALE("female", "女性"),
 5     UNKNOWN("unknown", "未知");
 6 
 7     private String code;
 8     private String sex;
 9 
10     SexEnum(String code, String sex) {
11         this.code = code;
12         this.sex = sex;
13     }
14 }
  • 最後一步定義一個策略選擇器
 1 public class ContextStrategy {
 2 
 3     private MalePerson malePerson = new MalePerson();
 4     private FemalePerson femalePerson = new FemalePerson();
 5     private UnknownPerson unknownPerson = new UnknownPerson();
 6 
 7     public Person getPersonStrategy(SexEnum sexEnum) {
 8         if ("male".equals(sexEnum.getCode())) {
 9             return malePerson;
10         } else if ("female".equals(sexEnum.getCode())) {
11             return femalePerson;
12         } else {
13             return unknownPerson;
14         }
15     }
16 }

 

  • 最終測試如下:
 1 public class Main {
 2     public static void main(String[] args) {
 3 
 4         ContextStrategy strategy = new ContextStrategy();
 5         strategy.getPersonStrategy(SexEnum.MALE).executeStrategy();
 6         strategy.getPersonStrategy(SexEnum.FEMALE).executeStrategy();
 7         strategy.getPersonStrategy(SexEnum.UNKNOWN).executeStrategy();
 8     }
 9 }
10 
11 // 結果如下:
12 // 我是男性
13 // 我是女性
14 // 未知性別

 

  其實我們可以看到。策略選擇器是傳入一個Enum類,然後根據傳入Enum的不同,選擇了不同的繼承類。從而實現了if else。優雅的過渡。

  可以看到,程式碼非常的優雅易懂,主程式碼,沒有if else分支。但同時代碼量多了起來。不過也很容易維護。

  總的來說,利大於弊。

  大致的圖例如下:

  

 

  

&n