相关文章推荐
着急的打火机  ·  地铁五线并行织密本地路网 ...·  1 年前    · 
健身的铁链  ·  《花少2》展示过最真实的郑爽|许晴|杨洋|井 ...·  1 年前    · 
粗眉毛的高山  ·  jQuery根据ID、CLASS、等获取对象 ...·  2 年前    · 
爱喝酒的茶叶  ·  ubuntu 22.04 ssh ...·  2 年前    · 
安静的铅笔  ·  Responsividade | ...·  3 年前    · 
Code  ›  代码优化-多态代替IF条件判断开发者社区
代码优化 多态
https://cloud.tencent.com/developer/article/1546411
刀枪不入的皮带
3 年前
作者头像
小码农薛尧
0 篇文章

代码优化-多态代替IF条件判断

原创
前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 小码农薛尧 > 代码优化-多态代替IF条件判断

代码优化-多态代替IF条件判断

原创
作者头像
小码农薛尧
修改 于 2019-12-02 11:19:39
571 0
修改 于 2019-12-02 11:19:39
举报

场景描述

在开发的场景中,常常会遇到打折的业务需求,每个用户对应的等级,他们的打折情况也是不一样的。例如普通会员打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 "";
 
推荐文章
着急的打火机  ·  地铁五线并行织密本地路网 福厦高铁开通串起双城生活_福州_新闻频道_福州新闻网
1 年前
健身的铁链  ·  《花少2》展示过最真实的郑爽|许晴|杨洋|井柏然_网易订阅
1 年前
粗眉毛的高山  ·  jQuery根据ID、CLASS、等获取对象_jq根据class获取对象-CSDN博客
2 年前
爱喝酒的茶叶  ·  ubuntu 22.04 ssh xshell 找不到匹配的host key - CSDN文库
2 年前
安静的铅笔  ·  Responsividade | HTML5 e CSS3 I: Suas primeiras páginas da Web | Alura - Cursos online de tecnologia
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号