Map<String, Consumer<String>>
は、アクションにコマンドを関連付けることができます。
GOFファクトリではなく、DPコマンドです。
しかし、これらは工場とコマンドパターンの公正で簡単な実装です。
それも考慮する必要があります。また、あなたはマップに配置する必要はありません無効なコマンドのための特別なアクションを作成でき
Map<String, Consumer<String>> actionsByCommand = new HashMap<>();
actionsByCommand.put("new train", command->{
command = command.replace("new train ", "");
Train t = new Train();
t.setCode(command);
ServiceProvider.getTrainService().saveOrUpdate(t);
responeHandler("train " + command + " created");
});
actionsByCommand.put("delete train", command->{
command = command.replace("delete train ", "");
...
});
// and so for...
:テスト容易性とアクションクラスの保守性を向上させるために
Consumer<String> invalidCommandAction = (command-> System.out.println("Invalid command. Here are the accepted commands..."));
を、あなたは 可能性がありそれらを別のクラスに移動します。
public class NewTrainAction implements Consumer<String>{
public void accept(String command){
command = command.replace("new train ", "");
Train t = new Train();
t.setCode(command);
ServiceProvider.getTrainService().saveOrUpdate(t);
responeHandler("train " + command + " created");
}
}
と同じように定義されている他のアクション:として定義NewTrainAction
で
Map<String, Consumer<String>> actionsByCommand = new HashMap<>();
actionsByCommand.put("new train", new NewTrainCommand());
actionsByCommand.put("delete train", new DeleteTrainCommand());
。
その後、この方法でそれらを使用することができます。多分
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String command = scanner.nextLine();
Consumer<String> action = actionsByCommand.getOrDefault(command, invalidCommandAction);
action.accept(command);
}
素晴らしいですが、私のコードは実際に呼び出されるたびにTrainCommandFactoryから新しいコマンドインスタンスを作成する必要がありますか?また、 'Singleton''' Composite'ではどういう意味ですか?コンポジットは、もし私が正しいなら、オブジェクトのツリーのようなものですか?シングルトンは1インスタンスしか保持できません。どのように私はそれら2を接続したいですか? – klokklok
複合シングルトン工場の回答を編集しました。毎回コマンドインスタンスを作成したくない場合は、 'TrainCommand'シングルトンを作成し、' fromString'が呼び出されるたびにファクトリに返すようにすることができます。しかし、String引数を受け入れるには 'execute'を変更する必要があります。 – daniu
ありがとう、私はあなたとMartin Frankの答えを組み合わせて使用しました! – klokklok