我有一個創建文本文件處理策略的引擎。這些文件採用各種格式,引擎通過將文件傳遞給一系列策略來選擇適當的策略,直到其中一個策略聲明它可以解析它。使用DI創建可插拔StrategyFactory
這不是經典的戰略模式。它與服務定位器模式和責任鏈模式有些相似,並可能包含其中的任何方面。
剝離下來,它看起來有點像這樣,儘管它目前與注射創建:
public class EngineImpl {
private Set<Strat> strategies = new HashSet<Strat>();
public EngineImpl(){
registerStrategy(new ConcreteStrat1());
registerStrategy(new ConcreteStrat2());
}
public void registerStrategy(Strat strat){
strategies.add(strat);
}
public Strat getStrategy(SomeClass input){
for (Strat s: strategies)
if (s.canParse(input)
return s;
return null;
}
}
既然這樣,問題是,EngineImpl必須知道在編譯的時候所有可用的策略,這個工作我希望能夠在不更改EngineImpl代碼的情況下部署新策略。我已經在其他地方尋找了在Java中執行此操作的選項,並提出了空白。我考慮讓Strat類向Engine註冊,但是它們永遠不會被類加載器加載,所以絕不會有機會註冊。
我可以使用哪些替代方法來註冊策略?儘管我目前正在使用DI,但我仍然接受其他基於反射和/或註解的解決方案。