zoukankan      html  css  js  c++  java
  • 策略模式的应用

    前言

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

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

    策略者模式

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

      总的来说,利大于弊。

      大致的图例如下:

      

      

  • 相关阅读:
    检测是否安装了新包
    redux和mobx的比较
    ssh登录远程服务器
    法律
    如何解决二方包彼此依赖?
    创业
    【转】裸辞4个月,面试30家公司。
    添加群机器人
    RESTful状态码说明
    MongoDB简单介绍以及基本命令
  • 原文地址:https://www.cnblogs.com/wenbochang/p/11184887.html
Copyright © 2011-2022 走看看