策略模式的應用

前言

  在春招秋招之時,由於面試中會問到大量的設計模式。因此有去看一些關於設計模式的書籍,博客,等等。好比秦小波老師寫的《設計模式之禪》。但當時僅限於看,包括如今也僅限於看。有的時候項目中,你都不知道有沒有運用到了設計模式。也許用到了單例模式,但你並不知道如何用的,不知不覺就用到了。面試

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

 

策略者模式

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

  很簡單的一個例子。好比人,人分爲男人,女人,甚至不清楚性別的人。但這三種類型的人,都有不一樣的行爲。那麼咱們在描述這些不一樣行爲的時候,通常咱們作法就是以下:this

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

  相似如上。不少個if,else進行嵌套。這樣很是的難看,不優雅。若是咱們用策略這模式替換,會怎麼樣。spa

 

策略者模式例子

  • 第一步定義一個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分支。但同時代碼量多了起來。不過也很容易維護。code

  總的來講,利大於弊。blog

  大體的圖例以下:繼承

  

相關文章
相關標籤/搜索