优雅替代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"})

浙公网安备 33010602011771号