1 changed files with 82 additions and 0 deletions
@ -0,0 +1,82 @@ |
|||||
|
import java.time.LocalDate; |
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Comparator; |
||||
|
import java.util.List; |
||||
|
import java.util.regex.Pattern; |
||||
|
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
// 策略接口
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
interface ParseStrategy { |
||||
|
boolean supports(String url); |
||||
|
Article parse(String url); |
||||
|
String getName(); |
||||
|
default int getPriority() { return 100; } |
||||
|
} |
||||
|
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
// 策略实现1:GitHub 专属(priority=10)
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
class GithubParseStrategy implements ParseStrategy { |
||||
|
@Override |
||||
|
public boolean supports(String url) { |
||||
|
return url != null && url.matches("^https?://(www\\.)?github\\.com/.*"); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Article parse(String url) { |
||||
|
String path = url.replaceFirst("https?://(www\\.)?github\\.com/", ""); |
||||
|
String[] parts = path.split("/"); |
||||
|
String owner = parts.length > 0 ? parts[0] : "unknown"; |
||||
|
String repo = parts.length > 1 ? parts[1] : "repo"; |
||||
|
return new Article("[GitHub] " + owner + "/" + repo, url, |
||||
|
"(GitHub stub)", owner, LocalDate.now()); |
||||
|
} |
||||
|
|
||||
|
@Override public String getName() { return "GithubParseStrategy"; } |
||||
|
@Override public int getPriority(){ return 10; } |
||||
|
} |
||||
|
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
// 策略实现2:通用默认兜底(priority=999)
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
class DefaultParseStrategy implements ParseStrategy { |
||||
|
private static final Pattern URL_PATTERN = |
||||
|
Pattern.compile("^https?://[^\\s/$.?#].[^\\s]*$"); |
||||
|
|
||||
|
@Override |
||||
|
public boolean supports(String url) { |
||||
|
return url != null && URL_PATTERN.matcher(url).matches(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Article parse(String url) { |
||||
|
String domain = url.replaceFirst("https?://", "").replaceAll("/.*", ""); |
||||
|
return new Article("文章来自 " + domain, url, |
||||
|
"(default stub)", "unknown", LocalDate.now()); |
||||
|
} |
||||
|
|
||||
|
@Override public String getName() { return "DefaultParseStrategy"; } |
||||
|
@Override public int getPriority(){ return 999; } |
||||
|
} |
||||
|
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
// 策略选择器
|
||||
|
// ─────────────────────────────────────────────
|
||||
|
class StrategySelector { |
||||
|
private final List<ParseStrategy> strategies = new ArrayList<>(); |
||||
|
|
||||
|
public StrategySelector() { |
||||
|
strategies.add(new GithubParseStrategy()); |
||||
|
strategies.add(new DefaultParseStrategy()); |
||||
|
strategies.sort(Comparator.comparingInt(ParseStrategy::getPriority)); |
||||
|
} |
||||
|
|
||||
|
public ParseStrategy select(String url) { |
||||
|
return strategies.stream() |
||||
|
.filter(s -> s.supports(url)) |
||||
|
.findFirst().orElse(null); |
||||
|
} |
||||
|
|
||||
|
public List<ParseStrategy> getAll() { return List.copyOf(strategies); } |
||||
|
} |
||||
Loading…
Reference in new issue