代码优化-多态代替IF条件判断
场景描述
在开发的场景中,常常会遇到打折的业务需求,每个用户对应的等级,他们的打折情况也是不一样的。例如普通会员打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条件判断的更多相关文章
- C# if中连续几个条件判断
C# if中连续几个条件判断 1.if (条件表达式1 && 条件表达式2) 当条件表达式1为true时 using System; using System.Collections. ...
- js条件判断时隐式类型转换
Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...
- 5-3 bash脚本编程之二 条件判断
1. 条件测试的表达式 1. [ expression ] :注意这个中括号的前后都有一个空格 2. [[ expression ]] 3. test expression 2.条件判断的类型 1. ...
- 第10章 Shell编程(3)_字符处理命令和条件判断
3. 字符处理命令 3.1 排序命令:sort (1)sort命令:#sort [选项] 文件名 选项 作用 -f 忽略大小写 -n 以数值型进行排序,默认使用字符串型排序 -r 反向排序 -t 指定 ...
- Nginx if 条件判断
Nginx if 条件判断: 1.公司网站上线有这样的需求: 由于公司网站域名从http到https的转移,在测试阶段需要公司内部进行测试,公司内部局域网访问时强制访问加密的https服务,外部用户访 ...
- shell条件判断与流程控制
一 条件判断式语句 1.按文件类型进行判断 测试类型 作用 -b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备 ...
- 为什么说在使用多条件判断时switch case语句比if语句效率高?
在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...
- wordpress 函数、条件判断以及文件的总结
WordPress基本模板文件 一套完整的WordPress模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : Arc ...
- 【重点】Shell入门教程:流程控制(2)条件判断的写法
第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...
随机推荐
- 使用WSAIoctl获取AcceptEx,Connectex,Getacceptexsockaddrs函数指针
运行WinNT和Win2000的系统上,这些APIs在Microsoft提供的DLL(mswsock.dll)里实现,可以通过链接mswsock.lib或者通过WSAioctl的SIO_GET_EXT ...
- Ajax与JSON,XML,PHP
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- win10下当前目录右键添加CMD快捷方式
在某个文件夹下右键打开cmd,这样不用每次都在默认情况下切换目录.无奈win10 1703版本下shift+右键不能打开cmd,只能打开powershell. 首先,在桌面新建一个文本文档. Wind ...
- 使用docker compose部署服务
谈到微服务的话题,技术上我们往往会涉及到多服务.多容器的部署与管理. Docker 有三个主要的作用:Build, Ship和Run.使用docker compose我们可以在Run的层面解决很多实际 ...
- deep_learning_Function_sklearn.preprocessing.LabelBinarizer()
在多数的机器学习比赛中,给出的标签都是非数字化的,所以我们需要对其进行转换.代码如下: from sklearn import preprocessing feature = [[0,1], [1,1 ...
- 1-win10配置 Vagrant 环境
1-win10配置 Vagrant 环境 2019.9.13 Vagrant 概述 vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 通过命令和配置文件来 ...
- BLE 5协议栈-链路层
文章转载自:http://www.sunyouqun.com/2017/04/page/3/ 链路层LL(Link Layer)是协议栈中最重要的一层. 链路层的核心是状态机,包含广播.扫描.发起和连 ...
- 一文透彻掌握 Python 编码问题
一.当我说字符时,我在说什么? 当我们提起字符串时,每个程序员都能理解到,我们说的是一个字符序列.但是,当我们说字符时,很多人就困惑了. 写在纸上的字符很容易辨识,但是为了将不同的字符在计算机中标识出 ...
- 【icpc2019网络赛南昌站】Yukino With Subinterval
傻b错误调一天系列 原题: 大意:给你一个数列a,字词两种操作: 1.把c[l]改成r 2.询问在区间[l,r]中,有多少个极大子区间满足子区间里的数全部一样,且在[x,y]范围内 (对于满足条件的区 ...
- UVa540 Team Queue(队列queue)
队列 STL队列定义在头文件<queue>中, 用“ queue<int>s ” 方式定义, 用push()和pop()进行元素的入队和出队操作, front()取队首元素(但 ...