场景描述

在开发的场景中,常常会遇到打折的业务需求,每个用户对应的等级,他们的打折情况也是不一样的。例如普通会员打9折,青铜会员打8.5折,黄金会员打8折等等。在一般开发中最简单的就是判断用户的等级,然后对订单作对应的打折处理。

场景示例

写了一个简单的小示例,如下所示:

//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,如下所示:

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

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();
}

优化

上面的这种做法,基本上是完成了优化,但是我们还会发现了一个问题,就是每次我们还是要创建对应的对象。上面有三个类,我们就要创建有三个对象,能否再次优化一下?

因为现在项目用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();
}

代码优化-多态代替IF条件判断的更多相关文章

  1. C# if中连续几个条件判断

    C# if中连续几个条件判断 1.if (条件表达式1 && 条件表达式2) 当条件表达式1为true时 using System; using System.Collections. ...

  2. js条件判断时隐式类型转换

    Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...

  3. 5-3 bash脚本编程之二 条件判断

    1. 条件测试的表达式 1. [ expression ]  :注意这个中括号的前后都有一个空格 2. [[ expression ]] 3. test expression 2.条件判断的类型 1. ...

  4. 第10章 Shell编程(3)_字符处理命令和条件判断

    3. 字符处理命令 3.1 排序命令:sort (1)sort命令:#sort [选项] 文件名 选项 作用 -f 忽略大小写 -n 以数值型进行排序,默认使用字符串型排序 -r 反向排序 -t 指定 ...

  5. Nginx if 条件判断

    Nginx if 条件判断: 1.公司网站上线有这样的需求: 由于公司网站域名从http到https的转移,在测试阶段需要公司内部进行测试,公司内部局域网访问时强制访问加密的https服务,外部用户访 ...

  6. shell条件判断与流程控制

    一 条件判断式语句 1.按文件类型进行判断 测试类型 作用 -b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备 ...

  7. 为什么说在使用多条件判断时switch case语句比if语句效率高?

    在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...

  8. wordpress 函数、条件判断以及文件的总结

    WordPress基本模板文件 一套完整的WordPress模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : Arc ...

  9. 【重点】Shell入门教程:流程控制(2)条件判断的写法

    第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...

随机推荐

  1. java实现spark常用算子之Take

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  2. java实现spark常用算子之mapPartitionsWithIndex

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  3. 03 Go语言特性

    一.基本注意事项 1.转义字符 \t 一个制表符,代表一次tab \n 换行符 \\ 转义代表 \ \" 转义代表 " \r 一个回车,从当前行的最前面开始输出,会覆盖以前的内容, ...

  4. JavaScript笔记(4)

    3.JavaScript事件 定义 1.事件是JavaScript事先定义好的 2.JavaScript中事件大多都是以"on--"开头的 3.事件由三要素组成:事件源.事件名.事 ...

  5. Java高并发程序设计学习笔记(十一):Jetty分析

    转自:https://blog.csdn.net/dataiyangu/article/details/87894253 new Server()初始化线程池QueuedThreadPoolexecu ...

  6. eclipse 导入外面的jar

    Eclipse中导入外部jar包 听语音 | 浏览:52620 | 更新:2014-12-07 20:59 | 标签:eclipse 1 2 3 4 5 6 7 分步阅读 在编写java代码时,为方便 ...

  7. VS2012隐藏输出窗口的快捷键是什么。

    纯属用键盘无法直接关闭这个窗口.有一个变通的方法是,先切换到这个输出窗口(标题呈现高亮的蓝色),使用Alt+W打开窗口菜单,选H隐藏就可以关闭.使用Ctrl+Alt+o可再次打开.按ESC就可以了.我 ...

  8. 记录-Intellij Idea下以Tomcat运行Web项目时的位置问题

    今天本来准备把原来的一个Web项目导入到Idea下,之前这个项目是用eclipse写的,容器用的tomcat,首先导入前我把一些没用的配置文件都给删了,像什么.eclipse..setting什么的, ...

  9. 基于Scrapt框架的全站数据爬取

    创建scrapy工程项目,除了爬虫文件中的代码需要略微修改,其他模块用法相同(如中间件,管道等): 爬虫文件代码流程 导入链接提取器 from scrapy.linkextractors import ...

  10. 第八章· Redis API 开发

    Redis 开发 1.源码安装Python环境 Python官网:https://www.python.org/ #下载Python3.6.4安装包 [root@db03 ~]# wget https ...