これを反映させないでください。その代わり、戦略のいくつかの種類にfunction1
/function2
をラップは、オブジェクト:
interface Strategy {
void doStuff();
}
class Function1 implements Strategy {
void doStuff() {
function1();
}
}
class Function2 implements Strategy {
void doStuff() {
function2();
}
}
その後
、いくつかの工場スタイルのクラスでこれらのすべてを登録します。
class StrategyFactory {
private Strategy defaultStrategy = new Function2();
Map<String, Strategy> strategies = ....
strategies.put("abc", new Function1());
...
Strategy getStrategy(String key) {
return strategies.getOrDefault(key, defaultStrategy);
}
}
を最後に、それを使用する:
factory.getStrategy(valueFromYaml).doStuff();
String
よりも複雑なオブジェクトにする必要がある場合は、key
を作成します。より複雑なシナリオのために食べたり、マップルックアップよりも高度な戦略を選択したりすることができます。
(これらのコンフィギュレーションは、DBやファイルから来ている場合など)を使用すると、マップ内Strategy
実装のクラス名のみを保持し、実行する前に、利用可能な戦略がわからない場合:
Map<String, String> strategyClassNames = ...;
strategy.put(keyFromDB, valueFromDB);
...
と
Class<? extends Strategy> strategy = Class.forName(strategyClassNames.get(key));
strategy.newInstance().doStuff();
yamlを使用して外部設定に関するドキュメントを読んだことはありますか? https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-yaml –
私はそのYMLについては考えていません。プロパティファイルでもあります。私はプロパティファイルから外部フィールドを取得する場合は私が理解する必要があります、私は私のJavaメソッドで帽子の設計に従うことができるように最小限のコードを変更する場合は、プロパティファイルの外部変数を追加します。 –