策略模式的应用

2019-08-09 00:00:00 模式 策略

前言

  在春招秋招之时,因为面试中会问到大量的设计模式。所以有去看一些关于设计模式的书籍,博客,等等。比如秦小波老师写的《设计模式之禅》。但当时仅限于看,包括现在也仅限于看。有的时候项目中,你都不知道有没有运用到了设计模式。也许用到了单例模式,但你并不知道如何用的,不知不觉就用到了。

  当时并不知道设计模式怎么用,仅仅于看。最近毕业了,进公司实习了一周左右。大概都是在看项目代码中度过的,其中看到了一处特别熟悉的代码。这个代码就是策略者模式。写的非常的优雅,在此记录一下。

 

策略者模式

  我个人简单理解,策略这模式就是代替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分支。但同时代码量多了起来。不过也很容易维护。

  总的来说,利大于弊。

  大致的图例如下:

  《策略模式的应用》

 

  

 

相关文章