優雅替代if else判斷邏輯
阿新 • • 發佈:2021-11-24
最初的邏輯
// 根據員工型別,輸出不同的工資 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"})