工廠模式+策略模式
阿新 • • 發佈:2021-01-16
場景
目前遇到這樣一個場景,就是會根據前端不同的傳值執行對應的方法策略。按照正常思路,需要在程式碼中使用if判斷前端的值來執行不同的方法。但這樣做的缺點是會造成大量if判斷,且下次新增加一個值對應一個策略,那麼就需要改動程式碼。
解決
對於這種根據值來執行不同策略的場景,可以使用工廠模式+策略模式來解決。
既然有策略,那麼我們就需要定義一個策略介面或策略抽象類。
public interface Strategy{
void doOperation();
String getStrategyName();
}
定義具體策略類,這裡定義了兩個策略類
@Component
public class StrategyA implements Strategy{
@Override
public void doOperation(){
System.out.println("執行策略a");
}
@Override
public String getStrategyName(){
return "strategyA"; //此處是該策略對應前端傳的值,
}
}
@Component
public class StrategyB implements Strategy{
@Override
public void doOperation(){
System.out.println("執行策略b");
}
@Override
public String getStrategyName(){
return "strategyB"; //此處是該策略對應前端傳的值,
}
}
定義工廠介面
public interface Factory{
Strategy createStrategy(String strategyName) ;
void registerStrategy(Strategy strategy);
}
具體策略工廠
@Component
public class StrategyFactory implements Factory{
// 該map用來存放策略名和對應策略類
private Map<String,Strategy> map= new ConcurrentHashMap<String,Strategy>();
@Override
public Strategy createStrategy(String strategyName){
return map.get(strategyName);
}
// 註冊策略類到工廠的map中
@Override
public void registerStrategy(Strategy strategy){
map.put(strategy.getStrategyName(), strategy);
}
}
在這裡我們需要將策略類放入工廠的map集合中,所以需要有一個註冊策略類的步驟,使用spring boot我們可以監聽容器事件來註冊
@Component
public class StartAction implements ApplicationListener<ContextRefreshedEvent>
{
@Autowired
private Factroy factory;
@Override
public void onApplicationEvent(ContextRefreshedEvent event)
{
Map<String, Strategy> map = event.getApplicationContext()
.getBeansOfType(Strategy.class);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext())
{
String key = iterator.next();
Strategy strategy = map.get(key);
factory.registerStrategy(strategy);
}
}
}
經過以上步驟我們的所有準備都完成,接下來就可以使用
// 當strategyName的值不同時,會獲取到不同的策略例項。當我們要新增一個策略時,只需實現Strategy介面
Strategy strategy = factory.createStrategy(strategyName);
strategy.doOperation();