package com.example.datacollect.strategy; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class StrategyFactory { private final List strategies = new ArrayList<>(); private final CrawlStrategy defaultStrategy; public StrategyFactory() { strategies.add(new HnuNewsStrategy()); strategies.add(new BlogStrategy()); strategies.add(new NewsStrategy()); strategies.add(new RegexStrategy(".*\\.edu\\.cn$", 80)); strategies.add(new RegexStrategy(".*\\.com$", 60)); strategies.sort(Comparator.comparingInt(CrawlStrategy::getPriority).reversed()); this.defaultStrategy = new DefaultStrategy(); } public CrawlStrategy getStrategy(String url) { List matched = new ArrayList<>(); for (CrawlStrategy s : strategies) { if (s.supports(url)) { matched.add(s); } } if (matched.isEmpty()) { return defaultStrategy; } if (matched.size() > 1) { System.out.println("WARNING: Multiple strategies matched for URL: " + url + ", using highest priority: " + matched.get(0).getClass().getSimpleName()); } return matched.get(0); } public void register(CrawlStrategy strategy) { strategies.add(strategy); strategies.sort(Comparator.comparingInt(CrawlStrategy::getPriority).reversed()); } public List getAllStrategies() { return new ArrayList<>(strategies); } public CrawlStrategy getDefaultStrategy() { return defaultStrategy; } }