package controller; import model.NovelRank; import strategy.CrawlerStrategy; import strategy.FanqieNovelStrategy; import strategy.QidianNovelStrategy; import strategy.ChangchenNovelStrategy; import exception.CrawlerException; import exception.ValidationException; import java.util.HashMap; import java.util.Map; import java.util.List; import java.util.ArrayList; public class CrawlerController { private Map strategies; public CrawlerController() { this.strategies = new HashMap<>(); initializeStrategies(); } private void initializeStrategies() { addStrategy(new FanqieNovelStrategy()); addStrategy(new QidianNovelStrategy()); addStrategy(new ChangchenNovelStrategy()); } public void addStrategy(CrawlerStrategy strategy) { strategies.put(strategy.getSiteName(), strategy); } public CrawlerStrategy getStrategy(String siteName) { CrawlerStrategy strategy = strategies.get(siteName); if (strategy == null) { throw new ValidationException("未知的网站: " + siteName); } return strategy; } public NovelRank crawlSite(String siteName) throws CrawlerException { CrawlerStrategy strategy = getStrategy(siteName); return strategy.crawl(); } public List crawlAllSites() throws CrawlerException { List ranks = new ArrayList<>(); for (CrawlerStrategy strategy : strategies.values()) { try { NovelRank rank = strategy.crawl(); ranks.add(rank); } catch (CrawlerException e) { System.err.println("[ERROR] 爬取 " + strategy.getSiteName() + " 失败: " + e.getMessage()); } } return ranks; } public List getAvailableSites() { return new ArrayList<>(strategies.keySet()); } }