在春招秋招之時,由於面試中會問到大量的設計模式。因此有去看一些關於設計模式的書籍,博客,等等。好比秦小波老師寫的《設計模式之禪》。但當時僅限於看,包括如今也僅限於看。有的時候項目中,你都不知道有沒有運用到了設計模式。也許用到了單例模式,但你並不知道如何用的,不知不覺就用到了。面試
當時並不知道設計模式怎麼用,僅僅於看。最近畢業了,進公司實習了一週左右。大概都是在看項目代碼中度過的,其中看到了一處特別熟悉的代碼。這個代碼就是策略者模式。寫的很是的優雅,在此記錄一下。設計模式
我我的簡單理解,策略這模式就是代替if else的一種模式。測試
很簡單的一個例子。好比人,人分爲男人,女人,甚至不清楚性別的人。但這三種類型的人,都有不一樣的行爲。那麼咱們在描述這些不一樣行爲的時候,通常咱們作法就是以下:this
1 if (male) { 2 //... 3 } else if (female) { 4 //... 5 } else { 6 //... 7 }
相似如上。不少個if,else進行嵌套。這樣很是的難看,不優雅。若是咱們用策略這模式替換,會怎麼樣。spa
1 public interface Person { 3 void executeStrategy(); 4 }
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 }
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分支。但同時代碼量多了起來。不過也很容易維護。code
總的來講,利大於弊。blog
大體的圖例以下:繼承