利用策略模式優化代碼的if else
今天我們來說說如何利用策略模式重構我們代碼中的if else
1、我們本着高內聚低耦合的設計理念,將ifelse中的代碼剝離出來,下面我們首先聲明一個接口方法:
/**
* 策略模式接口
*
* @author fengjie song
*
*/
public interface IStrategyPattern {
/**
* ifelse中具體需要實現的方法
*/
void test();
/**
* 策略支撐方法
*
* @return
*/
String support();
}
2、實現該接口的多種業務場景,我們這裏將會有多個實現類,這裏列舉兩個:
場景1:
@Service("strategyPatternImpl1")
public class StrategyPatternImpl1 implements IStrategyPattern {
@Override
public void test() {
System.out.println("這裏是策略1");
}
/**
* 這裏表示,當if條件裏面的值等於a的時候,使用策略1
*
* @return
*/
public String support() {
return "a";
}
}
場景2:
@Service("strategyPatternImpl2")
public class StrategyPatternImpl2 implements IStrategyPattern {
@Override
public void test() {
System.out.println("這裏是策略2");
}
/**
* 這裏表示,當if條件裏面的值等於a的時候,使用策略2
*
* @return
*/
public String support() {
return "b";
}
}
3、往往在調用方無法得知我具體該調用哪個策略,所以常規的寫法,大家就是用ifelse去判斷,然後調用不同的方法:
例如:if(“a”.equals(type)){…},在這裏建議大家用一個策略選擇器來優化它:
/**
* 策略選擇器
*
* @author fengjie song
*
*/
@Component
public class StrategyChoose implements ApplicationContextAware {
private ApplicationContext context;
private Map<String, IStrategyPattern> chooseMap = new HashMap<String, IStrategyPattern>(5);
/**
* 選擇策略
*
* @param type
* @return
*/
public IStrategyPattern choose(String type) {
return chooseMap.get(type);
}
/**
* 用來在服務啓動時,講策略的實現類初始化進我們事先準備chooseMap容器中
*
* @PostConstruct :該註解的方法只會在服務啓動時被加載一次
*/
@PostConstruct
public void register() {
// 這裏我們利用spring的上下文獲取策略接口的實現
Map<String, IStrategyPattern> map = context.getBeansOfType(IStrategyPattern.class);
for (IStrategyPattern strategy : map.values()) {
String type = strategy.support();
chooseMap.put(type, strategy);
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
}
4、這樣我們就可以直接調用策略模式啦
@RunWith(SpringRunner.class)
@SpringBootTest
public class StrategyTest {
@Autowired
private StrategyChoose strategyChoose;
public void test(String type) {
//這裏可以根據調用方的type直接調用具體的實現
strategyChoose.choose(type).test();
//這裏貼一下常規寫法
if ("a".equals(type)) {
// 調用策略1
}
if ("b".equals(type)) {
// 調用策略2
}
}
}
注:大家覺得那種寫法更好呢,當然了爲了避免過度設計,有時候ifelse顯得更易讀,建議在ifelse裏面有複雜的業務邏輯的時候用這種方法優化,如果只是爲了賦值可以利用枚舉來優化,或者switch語句