优雅替代if else判断逻辑

参考内容: 去除多余的if else, 5种方式你知道几种优化if else的几种方式

最初的逻辑

// 根据员工类型,输出不同的工资
public void getSalary(String person){
if(StringUtils.equals("BOSS", person)){
System.out.println("Boss salary 10000000");
}else if(StringUtils.equals("MANAGER", person)){
System.out.println("Manager salary 10000");
}else if(StringUtils.equals("STAFF", person)){
System.out.println("Staff salary 100");
}
}

工厂模式解决方案

  1. 新建抽象类,有获取工资的抽象方法

    public abstract class Salary {
    abstract void getSalary();
    }

  2. 三个不同的类 实现该方法

    public class Boss extends Salary {
    @Override
    public void getSalary() {
    System.out.println("Boss salary 10000000");
    }
    }

    public class Manager extends Salary {
    @Override
    public void getSalary() {
    System.out.println("Manager salary 10000");
    }
    }

    public class Staff extends Salary {
    @Override
    public void getSalary() {
    System.out.println("Staff salary 100");
    }
    }

  3. 静态工厂方式,提供获取工资方法调用

    public class TestSalary {
    static Map<String, Salary> data = new HashMap<>();
    static {
    data.put("BOSS", new Boss());
    data.put("MANAGER", new Manager());
    data.put("STAFF", new Staff());
    }

    public static void main(String[] args) {
    getSalary("MANAGER");
    }

    static void getSalary(String person){
    data.get(person).getSalary();
    }
    }

枚举解决方案

  1. 枚举类 内有抽象方法以及不同枚举值的实现

    public enum Salary {
    BOSS{
    @Override
    void getSalary() {
    System.out.println("Boss salary 10000000");
    }
    },
    MANAGER{
    @Override
    void getSalary() {
    System.out.println("Manager salary 10000");
    }
    },
    STAFF{
    @Override
    void getSalary() {
    System.out.println("Staff salary 100");
    }
    };

    abstract void getSalary();
    }

  2. 直接调用该枚举的抽象方法即可

    public class TestSalary {

    public static void main(String[] args) {
    getSalary(Salary.valueOf("BOSS"));
    }

    public static void getSalary(Salary salary){
    salary.getSalary();
    }
    }

springboot 策略模式注解方式

  1. 新建抽象类

    public abstract class Salary {
    abstract void getSalary();
    }

  2. 三个不同实现,实现该方法

    @Service("BOSS")
    public class Boss extends Salary {
    @Override
    public void getSalary() {
    System.out.println("Boss salary 10000000");
    }
    }

    @Service("MANAGER")
    public class Manager extends Salary {
    @Override
    public void getSalary() {
    System.out.println("Manager salary 10000");
    }
    }

    @Service("STAFF")
    public class Staff extends Salary {
    @Override
    public void getSalary() {
    System.out.println("Staff salary 100");
    }
    }

  3. 上下文切换类

    @Component("salaryContext")
    public class SalaryContext {
    @Autowired
    private final Map<String, Salary> salaryMap = new ConcurrentHashMap<>(3);
    public void getSalary(String serviceName) {
    salaryMap.get(serviceName).getSalary();
    }
    }

  4. 测试类

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = Application.class)
    public class ApplicationTests {
    @Resource
    private SalaryContext salaryContext;

    @Test
    public void contextLoads() {
    }

    @Test
    public void getSalary() {
    salaryContext.getSalary("BOSS");
    }
    }

注意:调试中,出现bean注入失败的原因,可以从以下顺序找问题(参考内容1参考内容2):

  1. 首先检测测试类包名和启动类包名是否一致
  2. @SpringBootTest(classes = Application.class) application为该项目的正常启动类
  3. @Test导包的是org.junit.Test
  4. Application记得配置扫描目录 @SpringBootApplication(scanBasePackages = {"com.xxx"})
posted @ 2021-11-24 17:35  CalronLoveRonnie  阅读(174)  评论(0)    收藏  举报
AmazingCounters.com