策略模式:定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立于使用演算法的客戶,
傳統的策略模式一般是創建公共介面、定義公共方法——》然后創建物體類實作公共介面、根據各自的邏輯重寫公共方法——》創建一個行為隨著策略物件改變而改變的 context 物件——》根據不同的傳參,呼叫不同的介面實作類方法,達到只改變引數即可獲得不同結果的目的,


但是也可以明顯發現,**這種策略模式的實作方式,代碼量較大,而且還要自定義要傳遞的引數,可能會引入一定數量的if/else,**有一定的優化空間,接下來,我會結合實際開發經驗,分享一種策略模式的優化方式,進一步優化代碼結構、減少代碼量,
首先,必不可少的需要創建公共介面、定義公共方法,然后創建物體類實作公共介面、根據各自的邏輯重寫公共方法,參考代碼如下:
定義公共介面CommonService,以及公共方法push()
1 package com.itcq.service.StrategyPattern;
2
3 public interface CommonService {
4 String push(String key);
5 }
創建三個不同的介面實作類,重寫push()方法
package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;
@Service
public class TestOne implements CommonService {
@Override
public String push(String key) {
return "1.這是模式:" + key;
}
}
package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;
@Service
public class TestTwo implements CommonService{
@Override
public String push(String key) {
return "2.這是模式:"+key;
}
}
package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;
@Service
public class TestThree implements CommonService{
@Override
public String push(String key) {
return "3.這是模式:"+key;
}
}
接下來就是重點,我們利用到springboot初始化Bean的方式結合HashMap,來實作對策略模式的優化
@Service
public class TestServiceTwo implements InitializingBean {
@Autowired
private ApplicationContext applicationContext;
private HashMap<String, CommonService> hashmap = new HashMap<>();
@Override
public void afterPropertiesSet() {
hashmap.put(StrategyTestEnum.STRATEGY_ONE.getTitle(), new TestOne());
hashmap.put(StrategyTestEnum.STRATEGY_TWO.getTitle(), this.applicationContext.getBean(TestTwo.class));
hashmap.put(StrategyTestEnum.STRATEGY_THREE.getTitle(), this.applicationContext.getBean(TestThree.class));
}
}
@Getter
public enum StrategyTestEnum {
STRATEGY_ONE("一", "模式一"),
STRATEGY_TWO("二", "模式二"),
STRATEGY_THREE("三", "模式三"),
;
private String title;
private String value;
StrategyTestEnum(String title, String value) {
this.title = title;
this.value = value;
}
}
TestServiceTwo實作InitializingBean介面,InitializingBean介面為bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是繼承該介面的類,在初始化bean的時候都會執行該方法,
定義一個hashmap集合,用來保存不同的公共介面實作類物件,這里把引數抽取成一個列舉類,利用SpringBoot的高級容器ApplicationContext,獲取Bean物件,當然這里直接new一個實作類物件也是可以的,將不同的引數和實作物件封裝到map集合中,實作引數和邏輯一一對應,
測驗方法如下,通過hashmap的key獲取對應的實作類物件,這樣就不必再自定義引數型別,徹底消除了if/else,也不用暴露給方法呼叫者過多的業務邏輯,
1 public String testMethod2(String key) {
2
3 CommonService commonService = hashmap.get(key);
4 Assert.notNull(commonService, "引數錯誤,找不到模式");
5 return commonService.push(key);
6 }
最后在controller層呼叫方法,進行測驗:
@Autowired
private TestServiceTwo testServiceTwo;
@GetMapping("/test/two")
public String testMethodTwo(@RequestParam(name = "key") String key) {
return testServiceTwo.testMethod2(key);
}
測驗結果如下:
引數正確情況下:

引數錯誤情況下:


利用這種自定義初始化bean+hashmap的方式完成了對策略模式的優化,優化了代碼的結構,并且徹底消除了if/else,個人認為可以很好地提升代碼質量,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301277.html
標籤:java
