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