在开发的场景中,经常会遇到打折的业务需求,每一个用户对应的等级,他们的打折状况也是不同的。例如普通会员打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();
}
复制代码