代碼優化-多態代替IF條件判斷

場景描述

在開發的場景中,經常會遇到打折的業務需求,每一個用戶對應的等級,他們的打折狀況也是不同的。例如普通會員打9折,青銅會員打8.5折,黃金會員打8折等等。在通常開發中最簡單的就是判斷用戶的等級,而後對訂單做對應的打折處理。java

場景示例

寫了一個簡單的小示例,以下所示:spring

//1 表明學生 2老師   3校長
int type = 1;
if (1 == type) {
    System.out.println("學生笑嘻嘻的說話");
} else if (2 == type) {
    System.out.println("老師開心的說話");
} else {
    System.out.println("校長嚴肅的說話");
}

上面的代碼,是咱們常常的作法,代碼少的時候,看起來很是清晰,可是代碼多起來或者有了更多的判斷條件,那上面的代碼會更加的混亂,若是每次有修改,都要改動這部分代碼。框架

解決方法

能夠把上面的代碼改爲多態方式,建立三個類,學生Student,老師Teacher,校長HeadMater,父類爲Person,這三個類都實現父類的方法say,以下所示:ide

Person.class測試

package me.xueyao.service;

/**
 * @author Simon.Xue
 * @date 2019-12-01 14:31
 **/
public interface Person {
    void say();
}

Student.class優化

package me.xueyao.service.impl;

import me.xueyao.service.Person;
import org.springframework.stereotype.Service;

/**
 * @author Simon.Xue
 * @date 2019-12-01 14:34
 **/
@Service
public class Student implements Person {
    @Override
    public void say() {
        System.out.println("學生笑嘻嘻的說話");
    }
}

Teacher.classcode

package me.xueyao.service.impl;

import me.xueyao.service.Person;
import org.springframework.stereotype.Service;

/**
 * @author Simon.Xue
 * @date 2019-12-01 14:37
 **/
@Service
public class Teacher implements Person {
    @Override
    public void say() {
        System.out.println("老師開心的說話");
    }
}

HeadMaster.class對象

package me.xueyao.service.impl;

import me.xueyao.service.Person;
import org.springframework.stereotype.Service;

/**
 * @author Simon.Xue
 * @date 2019-12-01 14:41
 **/
@Service
public class HeadMaster implements Person {

    @Override
    public void say() {
        System.out.println("校長嚴肅的說話");
    }
}

測試方法開發

@Test
public void testSay() {
    Person student = new Student();
    student.say();

    Person teacher = new Teacher();
    teacher.say();

    Person headMaster = new HeadMaster();
    headMaster.say();
}

優化

上面的這種作法,基本上是完成了優化,可是咱們還會發現了一個問題,就是每次咱們仍是要建立對應的對象。上面有三個類,咱們就要建立有三個對象,可否再次優化一下?get

由於如今項目用Sping框架,因此能夠用注入來完成優化。

首先,建立一個Person枚舉類,以下所示:

package me.xueyao.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
import me.xueyao.service.impl.HeadMaster;
import me.xueyao.service.impl.Student;
import me.xueyao.service.impl.Teacher;

/**
 * @author Simon.Xue
 * @date 2019-12-01 15:55
 **/
@AllArgsConstructor
@Getter
public enum  PersonEnums {
    STUDENT(1, "學生", Student.class),
    TEACHER(2, "老師", Teacher.class),
    HEADMASTER(3, "校長", HeadMaster.class);

    Integer code;
    String msg;
    Class clazz;

    /**
     * 得到類的名稱,由於Spring自動注入時,默認名稱是類名(首字母小寫)
     * @param code
     * @return
     */
    public static String className(Integer code) {
        for (PersonEnums value : values()) {
            if (value.getCode().equals(code)) {
                String simpleName = value.getClazz().getSimpleName();
                simpleName.substring(1);
                return String.valueOf(simpleName.charAt(0)).toLowerCase() + simpleName.substring(1);
            }
        }
        return "";
    }

}

使用方式 :

@Autowired
private Map<String, Person> personMap = new HashMap<>();
@Test
public void testSay() {
    personMap.get(PersonEnums.className(2)).say();
}
相關文章
相關標籤/搜索