zoukankan      html  css  js  c++  java
  • 优雅替代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"})
  • 相关阅读:
    Mybatis学习总结(五)——动态sql
    1006 换个格式输出整数(15分)
    1005 继续(3n+1)猜想(25分) *
    1004 成绩排名(20分)
    1003 我要通过!(20分)*
    1002 写出这个数(20分) *
    1001 害死人不偿命的(3n+1)猜想(15分)
    CCSP 201312-2 ISBN号码
    CCSP201312-1出现次数最多的数
    c++动态定义数组
  • 原文地址:https://www.cnblogs.com/cuiyf/p/15599164.html
Copyright © 2011-2022 走看看