在春招秋招之时,由于面试中会问到大量的设计模式。因此有去看一些关于设计模式的书籍,博客,等等。好比秦小波老师写的《设计模式之禅》。但当时仅限于看,包括如今也仅限于看。有的时候项目中,你都不知道有没有运用到了设计模式。也许用到了单例模式,但你并不知道如何用的,不知不觉就用到了。面试
当时并不知道设计模式怎么用,仅仅于看。最近毕业了,进公司实习了一周左右。大概都是在看项目代码中度过的,其中看到了一处特别熟悉的代码。这个代码就是策略者模式。写的很是的优雅,在此记录一下。设计模式
我我的简单理解,策略这模式就是代替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
大体的图例以下:继承