代码优化-多态代替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.classspa

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.classcode

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();
}
复制代码

优化

上面的这种作法,基本上是完成了优化,可是咱们还会发现了一个问题,就是每次咱们仍是要建立对应的对象。上面有三个类,咱们就要建立有三个对象,可否再次优化一下?开发

由于如今项目用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();
}
复制代码
相关文章
相关标签/搜索