前言
在春招秋招之時,因為面試中會問到大量的設計模式。所以有去看一些關於設計模式的書籍,博客,等等。比如秦小波老師寫的《設計模式之禪》。但當時僅限於看,包括現在也僅限於看。有的時候項目中,你都不知道有沒有運用到了設計模式。也許用到了單例模式,但你並不知道如何用的,不知不覺就用到了。
當時並不知道設計模式怎么用,僅僅於看。最近畢業了,進公司實習了一周左右。大概都是在看項目代碼中度過的,其中看到了一處特別熟悉的代碼。這個代碼就是策略者模式。寫的非常的優雅,在此記錄一下。
策略者模式
我個人簡單理解,策略這模式就是代替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分支。但同時代碼量多了起來。不過也很容易維護。
總的來說,利大於弊。
大致的圖例如下: