You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.8 KiB
57 lines
1.8 KiB
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Controller: 解析输入、分发命令、维护历史记录
|
|
* 严格遵守 MVC:不持有任何 System.out,所有输出走 view
|
|
*/
|
|
public class CrawlerController {
|
|
private final ConsoleView view;
|
|
private final List<Article> articles;
|
|
private final Map<String, Command> commands = new HashMap<>();
|
|
private final List<String> history = new ArrayList<>(); // 作业2
|
|
|
|
public CrawlerController(ConsoleView view, List<Article> articles) {
|
|
this.view = view;
|
|
this.articles = articles;
|
|
registerCommands();
|
|
}
|
|
|
|
private void registerCommands() {
|
|
CrawlCommand crawl = new CrawlCommand(view);
|
|
register(crawl.getName(), crawl);
|
|
register(crawl.getAlias(), crawl); // 选做:别名 "c"
|
|
|
|
register(new ListCommand(view));
|
|
register(new HelpCommand(view));
|
|
register(new ExitCommand(view));
|
|
register(new HistoryCommand(view, history)); // 作业2,注入共享 history
|
|
}
|
|
|
|
private void register(Command cmd) {
|
|
commands.put(cmd.getName(), cmd);
|
|
}
|
|
|
|
private void register(String key, Command cmd) {
|
|
commands.put(key, cmd);
|
|
}
|
|
|
|
/** 处理一行用户输入 */
|
|
public void handle(String input) {
|
|
if (input == null || input.isBlank()) return;
|
|
|
|
history.add(input); // 作业2:记录每条命令
|
|
|
|
String[] parts = input.trim().split("\\s+");
|
|
String name = parts[0].toLowerCase();
|
|
Command cmd = commands.get(name);
|
|
|
|
if (cmd == null) {
|
|
view.printError("未知命令:" + name + "。输入 help 查看可用命令。");
|
|
} else {
|
|
cmd.execute(parts, articles);
|
|
}
|
|
}
|
|
}
|
|
|