注:これは完全な例です。インタフェースタイプによる自動登録のみをお探しの場合は、最後の部分にスクロールしてください。
ストラテジーデザインパターンは、ファンクションテーブルを使用して実装できます。これは、Map<String,IImpl>
の実装を格納します。ここで、keyはアルゴリズムの名前であり、valueはアルゴリズムの具体的な実装です。
共通のアプローチ:
は、インターフェースSolver
のimlementations間で共有するすべてのパラメータを保持するクラスContext
を考えてみましょう。必要なメソッドsolve
とname
public interface Solver {
void solve(Context context);
String name();
}
と
public class Context extends HashMap<String,Object> {
public <T> T get(String key, Class<T> resultClass){
return resultClass.cast(get(key));
}
public <T> T getOrDefault(String key, T def, Class<T> resultClass){
return resultClass.cast(getOrDefault(key,def));
}
}
およびインターフェイスSolver
次に、あなたが共有Context
オブジェクトを変更Solver
インタフェースの実装を作成することができます。この例ではAddSolver
とMultiplySolver
を作成しました。
AddSolver.java:
public class AddSolver implements Solver {
@Override
public void solve(Context context) {
context.put("result", context.getOrDefault("result",0.0, Double.class) + context.get("add", Double.class));
}
@Override
public String name() {
return "+";
}
}
MultiplySolver.java
public class MultiplySolver implements Solver {
@Override
public void solve(Context context) {
context.put("result", context.getOrDefault("result",0.0, Double.class) * context.get("multiply", Double.class));
}
@Override
public String name() {
return "*";
}
}
Map<String,Solver>
の手動構成:インタフェースSolver
の
実装がに格納することができます
@Test
public void testCustomFunctionMap(){
HashMap<String,Solver> functionMap = new HashMap<>();
functionMap.put("+", new AddSolver());
functionMap.put("*", new MultiplySolver());
Context context = new Context();
context.put("add", 2.0);
functionMap.get("+").solve(context);
TestCase.assertEquals(2.0, context.get("result", Double.class));
context.put("multiply", 3.0);
functionMap.get("*").solve(context);
TestCase.assertEquals(6.0, context.get("result", Double.class));
}
自動的Map<String,Solver>
をcostruct必要がある場合はより多くのアプローチが、ありMap<String,Solver>
の自動構築。それらの多くはthis questionに記載されています。私はorg.reflectionsライブラリを使用しました。
public class SolverScanner{
static HashMap<String, Solver> functionMap;
static {
functionMap = new HashMap<>();
Reflections reflections = new Reflections(SolverScanner.class.getPackage().getName());
for(Class<? extends Solver> clazz : reflections.getSubTypesOf(Solver.class)){
try {
Solver solver = clazz.newInstance();
functionMap.put(solver.name(), solver);
} catch (Exception e) {
throw new IllegalStateException("Cannot construct functionMap",e);
}
}
}
public static HashMap<String, Solver> getFunctionMap(){
return functionMap;
}
private SolverScanner(){}//disable instantiating
}
と使用方法:
@Test
public void testSolverScannerFunctionMap(){
HashMap<String,Solver> functionMap = SolverScanner.getFunctionMap();
Context context = new Context();
context.put("add", 2.0);
functionMap.get("+").solve(context);
TestCase.assertEquals(2.0, context.get("result", Double.class));
context.put("multiply", 3.0);
functionMap.get("*").solve(context);
TestCase.assertEquals(6.0, context.get("result", Double.class));
}
ことが可能であることを確認してください。質問とは何ですか?それをやってください。 – Vadim
@ Vadim、私はこれを実装に固執しています。私はどのようにすべての戦略を登録することができますか?インターフェイス – Sonique
あなたが投稿したコードはJavaではありません。どの言語をお探しですか? – Bedla