From ac55b3e4d021cf6b6aa872c9c112264866095e3e Mon Sep 17 00:00:00 2001 From: zhaoyinghui <17627019082@163.com> Date: Tue, 19 May 2026 11:13:41 +0800 Subject: [PATCH] strategy W10 --- .../java/com/example/datacollect/Main.java | 12 +++--- .../example/datacollect/command/Command.java | 5 +-- .../datacollect/command/CrawlCommand.java | 23 ++++++++-- .../datacollect/command/ExitCommand.java | 7 ++- .../datacollect/command/HelpCommand.java | 7 ++- .../datacollect/command/HistoryCommand.java | 7 +-- .../datacollect/command/ListCommand.java | 16 +++++-- .../controller/CrawlerController.java | 27 ++++++------ .../repository/ArticleRepository.java | 42 ++++++++++++++++++ .../datacollect/strategy/CrawlStrategy.java | 10 +++++ .../datacollect/strategy/MockStrategy.java | 22 ++++++++++ .../datacollect/strategy/SimpleStrategy.java | 43 +++++++++++++++++++ .../datacollect/strategy/StrategyFactory.java | 41 ++++++++++++++++++ 13 files changed, 222 insertions(+), 40 deletions(-) create mode 100644 java-cli(1)/java-cli/src/main/java/com/example/datacollect/repository/ArticleRepository.java create mode 100644 java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/CrawlStrategy.java create mode 100644 java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/MockStrategy.java create mode 100644 java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/SimpleStrategy.java create mode 100644 java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/StrategyFactory.java diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/Main.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/Main.java index 44d00aa..2bac9a1 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/Main.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/Main.java @@ -1,21 +1,19 @@ package com.example.datacollect; import com.example.datacollect.controller.CrawlerController; -import com.example.datacollect.model.Article; +import com.example.datacollect.repository.ArticleRepository; import com.example.datacollect.view.ConsoleView; -import java.util.ArrayList; -import java.util.List; public class Main { public static void main(String[] args) { ConsoleView view = new ConsoleView(); - List
articles = new ArrayList<>(); - CrawlerController controller = new CrawlerController(view, articles); + ArticleRepository repository = new ArticleRepository(); + CrawlerController controller = new CrawlerController(view, repository); - view.printSuccess("Welcome to CLI Crawler (w9_1)! Type help for commands."); + view.printSuccess("Welcome to CLI Crawler (w10)! Type help for commands."); while (true) { controller.handle(view.readLine()); } } -} +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/Command.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/Command.java index 24e59a6..029cadc 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/Command.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/Command.java @@ -1,9 +1,8 @@ package com.example.datacollect.command; -import com.example.datacollect.model.Article; -import java.util.List; +import com.example.datacollect.repository.ArticleRepository; public interface Command { String getName(); - void execute(String[] args, List
articles); + void execute(String[] args, ArticleRepository repository); } diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/CrawlCommand.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/CrawlCommand.java index 45baea1..5f58a48 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/CrawlCommand.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/CrawlCommand.java @@ -1,14 +1,20 @@ package com.example.datacollect.command; import com.example.datacollect.model.Article; +import com.example.datacollect.repository.ArticleRepository; +import com.example.datacollect.strategy.CrawlStrategy; +import com.example.datacollect.strategy.StrategyFactory; import com.example.datacollect.view.ConsoleView; + import java.util.List; public class CrawlCommand implements Command { private final ConsoleView view; + private final StrategyFactory strategyFactory; - public CrawlCommand(ConsoleView view) { + public CrawlCommand(ConsoleView view, StrategyFactory strategyFactory) { this.view = view; + this.strategyFactory = strategyFactory; } @Override @@ -17,11 +23,20 @@ public class CrawlCommand implements Command { } @Override - public void execute(String[] args, List
articles) { + public void execute(String[] args, ArticleRepository repository) { if (args.length < 2) { view.printError("Usage: crawl "); return; } - view.printInfo("Stub: would crawl " + args[1]); + + String url = args[1]; + CrawlStrategy strategy = strategyFactory.getStrategy(url); + + view.printInfo("Crawling " + url + " using " + strategy.getName() + " strategy..."); + + List
articles = strategy.crawl(url); + repository.addAll(articles); + + view.printSuccess("Crawl completed! Added " + articles.size() + " articles."); } -} +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ExitCommand.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ExitCommand.java index 6946d85..15c2f00 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ExitCommand.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ExitCommand.java @@ -1,8 +1,7 @@ package com.example.datacollect.command; -import com.example.datacollect.model.Article; +import com.example.datacollect.repository.ArticleRepository; import com.example.datacollect.view.ConsoleView; -import java.util.List; public class ExitCommand implements Command { private final ConsoleView view; @@ -17,8 +16,8 @@ public class ExitCommand implements Command { } @Override - public void execute(String[] args, List
articles) { + public void execute(String[] args, ArticleRepository repository) { view.printSuccess("Bye!"); System.exit(0); } -} +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HelpCommand.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HelpCommand.java index 3c6597a..7f943f9 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HelpCommand.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HelpCommand.java @@ -1,8 +1,7 @@ package com.example.datacollect.command; -import com.example.datacollect.model.Article; +import com.example.datacollect.repository.ArticleRepository; import com.example.datacollect.view.ConsoleView; -import java.util.List; public class HelpCommand implements Command { private final ConsoleView view; @@ -17,7 +16,7 @@ public class HelpCommand implements Command { } @Override - public void execute(String[] args, List
articles) { + public void execute(String[] args, ArticleRepository repository) { view.printInfo("Commands: crawl , list, history, help, exit"); } -} +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HistoryCommand.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HistoryCommand.java index 70b3aa5..b93b902 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HistoryCommand.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HistoryCommand.java @@ -1,9 +1,10 @@ package com.example.datacollect.command; -import com.example.datacollect.model.Article; -import com.example.datacollect.view.ConsoleView; import java.util.List; +import com.example.datacollect.repository.ArticleRepository; +import com.example.datacollect.view.ConsoleView; + public class HistoryCommand implements Command { private final ConsoleView view; private final List history; @@ -19,7 +20,7 @@ public class HistoryCommand implements Command { } @Override - public void execute(String[] args, List
articles) { + public void execute(String[] args, ArticleRepository repository) { if (history.isEmpty()) { view.printInfo("暂无命令历史"); return; diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ListCommand.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ListCommand.java index 8eba2cd..67e6f3e 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ListCommand.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ListCommand.java @@ -1,7 +1,9 @@ package com.example.datacollect.command; import com.example.datacollect.model.Article; +import com.example.datacollect.repository.ArticleRepository; import com.example.datacollect.view.ConsoleView; + import java.util.List; public class ListCommand implements Command { @@ -17,7 +19,15 @@ public class ListCommand implements Command { } @Override - public void execute(String[] args, List
articles) { - view.display(articles); + public void execute(String[] args, ArticleRepository repository) { + List
articles = repository.getAll(); + if (articles.isEmpty()) { + view.printInfo("暂无文章,请先执行 crawl。"); + return; + } + for (int i = 0; i < articles.size(); i++) { + Article a = articles.get(i); + System.out.println((i + 1) + ". " + a.getTitle() + " | " + a.getUrl() + " | " + a.getAuthor() + " | " + a.getPublishDate()); + } } -} +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/controller/CrawlerController.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/controller/CrawlerController.java index b5ddaef..49a6437 100644 --- a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/controller/CrawlerController.java +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/controller/CrawlerController.java @@ -1,33 +1,36 @@ package com.example.datacollect.controller; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import com.example.datacollect.command.Command; import com.example.datacollect.command.CrawlCommand; import com.example.datacollect.command.ExitCommand; import com.example.datacollect.command.HelpCommand; import com.example.datacollect.command.HistoryCommand; import com.example.datacollect.command.ListCommand; -import com.example.datacollect.model.Article; +import com.example.datacollect.repository.ArticleRepository; +import com.example.datacollect.strategy.StrategyFactory; import com.example.datacollect.view.ConsoleView; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class CrawlerController { private final Map commands = new HashMap<>(); private final ConsoleView view; - private final List
articles; + private final ArticleRepository repository; private final List history = new ArrayList<>(); private HistoryCommand historyCommand; - public CrawlerController(ConsoleView view, List
articles) { + public CrawlerController(ConsoleView view, ArticleRepository repository) { this.view = view; - this.articles = articles; + this.repository = repository; + StrategyFactory strategyFactory = new StrategyFactory(); + historyCommand = new HistoryCommand(view, history); register(new HelpCommand(view)); register(new ListCommand(view)); - register(new CrawlCommand(view)); + register(new CrawlCommand(view, strategyFactory)); register(new ExitCommand(view)); register(historyCommand); } @@ -51,6 +54,6 @@ public class CrawlerController { view.printError("Unknown command: " + cmdName); return; } - command.execute(args, articles); + command.execute(args, repository); } -} +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/repository/ArticleRepository.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/repository/ArticleRepository.java new file mode 100644 index 0000000..f2b70a5 --- /dev/null +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/repository/ArticleRepository.java @@ -0,0 +1,42 @@ +package com.example.datacollect.repository; + +import com.example.datacollect.model.Article; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class ArticleRepository { + private final List
articles = new ArrayList<>(); + + public void add(Article article) { + if (article != null) { + articles.add(article); + } + } + + public void addAll(List
newArticles) { + if (newArticles != null && !newArticles.isEmpty()) { + articles.addAll(newArticles); + } + } + + public List
getAll() { + return Collections.unmodifiableList(articles); + } + + public Optional
findByTitle(String title) { + return articles.stream() + .filter(a -> a.getTitle().equals(title)) + .findFirst(); + } + + public int count() { + return articles.size(); + } + + public void clear() { + articles.clear(); + } +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/CrawlStrategy.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/CrawlStrategy.java new file mode 100644 index 0000000..cc5e7e1 --- /dev/null +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/CrawlStrategy.java @@ -0,0 +1,10 @@ +package com.example.datacollect.strategy; + +import com.example.datacollect.model.Article; + +import java.util.List; + +public interface CrawlStrategy { + String getName(); + List
crawl(String url); +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/MockStrategy.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/MockStrategy.java new file mode 100644 index 0000000..db10387 --- /dev/null +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/MockStrategy.java @@ -0,0 +1,22 @@ +package com.example.datacollect.strategy; + +import com.example.datacollect.model.Article; + +import java.util.ArrayList; +import java.util.List; + +public class MockStrategy implements CrawlStrategy { + + @Override + public String getName() { + return "mock"; + } + + @Override + public List
crawl(String url) { + List
articles = new ArrayList<>(); + articles.add(new Article("Mock Article 1", url, "Mock content 1", "Mock Author", "2024-01-01")); + articles.add(new Article("Mock Article 2", url, "Mock content 2", "Mock Author", "2024-01-02")); + return articles; + } +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/SimpleStrategy.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/SimpleStrategy.java new file mode 100644 index 0000000..e78fbf6 --- /dev/null +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/SimpleStrategy.java @@ -0,0 +1,43 @@ +package com.example.datacollect.strategy; + +import com.example.datacollect.model.Article; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleStrategy implements CrawlStrategy { + + @Override + public String getName() { + return "simple"; + } + + @Override + public List
crawl(String url) { + List
articles = new ArrayList<>(); + String siteName = extractSiteName(url); + articles.add(new Article("Simple Article from " + siteName, url, "Simple content extracted from " + url, + "Anonymous", java.time.LocalDate.now().toString())); + articles.add(new Article("Another Article from " + siteName, url, "More content from " + url, + "Unknown", java.time.LocalDate.now().toString())); + articles.add(new Article("Latest News from " + siteName, url, "Breaking news content", + "Editor", java.time.LocalDate.now().toString())); + return articles; + } + + private String extractSiteName(String url) { + try { + if (url.startsWith("http://") || url.startsWith("https://")) { + int start = url.indexOf("://") + 3; + int end = url.indexOf('/', start); + if (end > start) { + return url.substring(start, end); + } + return url.substring(start); + } + return url; + } catch (Exception e) { + return url; + } + } +} \ No newline at end of file diff --git a/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/StrategyFactory.java b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/StrategyFactory.java new file mode 100644 index 0000000..0360d9c --- /dev/null +++ b/java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/StrategyFactory.java @@ -0,0 +1,41 @@ +package com.example.datacollect.strategy; + +import java.util.HashMap; +import java.util.Map; + +public class StrategyFactory { + private final Map strategies = new HashMap<>(); + + public StrategyFactory() { + register(new MockStrategy()); + register(new SimpleStrategy()); + } + + public void register(CrawlStrategy strategy) { + strategies.put(strategy.getName().toLowerCase(), strategy); + } + + public CrawlStrategy getStrategy(String url) { + if (url == null || url.isEmpty()) { + return strategies.get("mock"); + } + + if (url.toLowerCase().contains("mock")) { + return strategies.get("mock"); + } + + if (url.toLowerCase().contains("simple")) { + return strategies.get("simple"); + } + + if (url.startsWith("http://") || url.startsWith("https://")) { + return strategies.get("simple"); + } + + return strategies.get("mock"); + } + + public CrawlStrategy getStrategyByName(String name) { + return strategies.get(name.toLowerCase()); + } +} \ No newline at end of file