专栏首页小码农薛尧代码优化-多态代替IF条件判断
原创

代码优化-多态代替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();
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    在程序中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存储位置快。通过缓存,可以高效地重用之...

    小码农薛尧
  • Docker入门-docker compose的使用

    Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。其代码目前在https://github.com/docker/com...

    小码农薛尧
  • 设计模式入门-简单工厂模式

    话说设计模式是我们面试中经常遇到的问题,但是开发中遇到的也不少。之前一直想学设计模式,然后总结写一些文章,但一直忙于其它事情,现在终于要学习设计模式,参考的书籍...

    小码农薛尧
  • Python入门之并发编程IO模型

    Jetpropelledsnake21
  • 匿名内部类何为匿名?

    比如为什么称之为匿名? 为什么也算是一个类,而且是内部类? 它和内部类有什么区别?

    PhoenixZheng
  • 基于JavaAgent的全链路监控五《ThreadLocal链路追踪》

    当业务程序代码在线上运行时,实例A、实例B、实例C,他们直接可能从上到下依次调用,为了能很好的监控程序的调用链路,我们需要对调用链路进行追踪监控。实例的外部可能...

    小傅哥
  • 前端基础-Ajax框架的封装

    如果一个页面中有十几个地方用到Ajax,那么我们需要写十几次open()、十几次send()、十几次获取xhr对象; 代码重复相当多,而凡是有代码重复的地方,...

    cwl_java
  • 中国蝉联澳大利亚昆士兰州最大国际游客来源国 | 每周文旅资讯精选

    ? ? 买春运火车票部分列车最高打七折 2019年春运大幕即将开启,近日,北京青年报记者从北京西站了解到,目前涉及北京铁路的折扣方案已经出炉,春节前回空...

    腾讯文旅
  • 【攻略】如何在云开发中使用 Redis?

    默认情况下,云开发的函数部署在公共网络中,只可以访问公网。如果开发者需要访问腾讯云的 Redis、TencentDB、CVM、Kafka 等资源,需要建立私有网...

    Booker Zhao
  • spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例

    使用 Java EE - Eclipse 新建一 Dynamic Web Project

    noteless

扫码关注云+社区

领取腾讯云代金券