优雅替代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");
}
}
工厂模式解决方案
-
新建抽象类,有获取工资的抽象方法
public abstract class Salary { abstract void getSalary(); }
-
三个不同的类 实现该方法
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"); } }
-
静态工厂方式,提供获取工资方法调用
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(); } }
枚举解决方案
-
枚举类 内有抽象方法以及不同枚举值的实现
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(); }
-
直接调用该枚举的抽象方法即可
public class TestSalary { public static void main(String[] args) { getSalary(Salary.valueOf("BOSS")); } public static void getSalary(Salary salary){ salary.getSalary(); } }
springboot 策略模式注解方式
-
新建抽象类
public abstract class Salary { abstract void getSalary(); }
-
三个不同实现,实现该方法
@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"); } }
-
上下文切换类
@Component("salaryContext") public class SalaryContext { @Autowired private final Map<String, Salary> salaryMap = new ConcurrentHashMap<>(3); public void getSalary(String serviceName) { salaryMap.get(serviceName).getSalary(); } }
-
测试类
@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):
- 首先检测测试类包名和启动类包名是否一致
- @SpringBootTest(classes = Application.class) application为该项目的正常启动类
- @Test导包的是org.junit.Test
- Application记得配置扫描目录 @SpringBootApplication(scanBasePackages = {"com.xxx"})