优雅替代ifelse判断逻辑-创新互联

参考内容: 去除多余的if else, 5种方式你知道几种, 优化if else的几种方式优雅替代ifelse判断逻辑

最初的逻辑

// 根据员工类型,输出不同的工资
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. 新建抽象类,有获取工资的抽象方法

    创新互联为企业级客户提高一站式互联网+设计服务,主要包括成都做网站、成都网站制作、app开发定制、成都小程序开发、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。 
     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 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 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"})

网页题目:优雅替代ifelse判断逻辑-创新互联
分享URL:http://scyanting.com/article/igojc.html