当前位置:首页 > Java > 正文内容

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

flowstone6年前 (2019-12-01)Java493

场景描述

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

扫描二维码推送至手机访问。

版权声明:本文由薛尧的博客发布,如需转载请注明出处。

本文链接:https://flowstone.sourceforge.io/?id=54

分享给朋友:

相关文章

import和import static说明

今天学习rest assured自动测试框架时,写了一些Demo,看到官网上快速指南上有静态导入某个包,起初没有注意以为是import的另一种叫法,在代码的部分导入了所需要的包,但是不能调用包中的方法。后来在百度上找到了解释,原来静态导入包...

IntelliJ IDEA技巧一之隐藏.idea目录

问题场景通过IntelliJ IDEA软件创建Java Web项目时,项目目录中总会生成.idea配置目录并在软件界面里显示,影响项目美感,如何在软件界面中隐藏.idea目录呢?解决方法打开IDEA软件的设置(Mac是Preferences...

ElasticSearch从入门到放弃(一)-安装&运行

这几天看到新闻,说ElasticSearch上市了,真的没有想到这个非常流行的开源项目竟然上市了,这个公司的程序员都走上了财务自由的道路。 以前用过ElasticSearch全文搜索引擎,但是时间长也忘记了差不多了,以前而且还是用的老版本,...

Java编程思想学习总结一(一切都是对象)

存储位置寄存器堆栈 存储对象引用,堆栈指针向下移动,分配新的内存,向上移动,释放内存堆 存储Java对象常量存储 存储常量值非RAM存储 存储流对象和持久化对象基本类型所占存储空间基本类型大小包装器类型默认值boolean16bitBool...

Java内存缓存-通过Map定制简单缓存

缓存在程序中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存储位置快。通过缓存,可以高效地重用之前检索或计算的数据。为什么要用缓存场景在Java应用中,对于访问频率高,更新...

Java多线程-程序运行堆栈分析

class文件内容class文件包含JAVA程序执行的字节码;数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符;文件开头有一个0xcafebabe(16进制)特殊的一个标志。JVM运行时数据区线程独占:每个线程都会有它...