Browse Source

strategy W10

master
zhaoyinghui 1 month ago
parent
commit
ac55b3e4d0
  1. 10
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/Main.java
  2. 5
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/Command.java
  3. 21
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/CrawlCommand.java
  4. 5
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ExitCommand.java
  5. 5
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HelpCommand.java
  6. 7
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/HistoryCommand.java
  7. 14
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/command/ListCommand.java
  8. 25
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/controller/CrawlerController.java
  9. 42
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/repository/ArticleRepository.java
  10. 10
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/CrawlStrategy.java
  11. 22
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/MockStrategy.java
  12. 43
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/SimpleStrategy.java
  13. 41
      java-cli(1)/java-cli/src/main/java/com/example/datacollect/strategy/StrategyFactory.java

10
java-cli(1)/java-cli/src/main/java/com/example/datacollect/Main.java

@ -1,19 +1,17 @@
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<Article> 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());
}

5
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<Article> articles);
void execute(String[] args, ArticleRepository repository);
}

21
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<Article> articles) {
public void execute(String[] args, ArticleRepository repository) {
if (args.length < 2) {
view.printError("Usage: crawl <url>");
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<Article> articles = strategy.crawl(url);
repository.addAll(articles);
view.printSuccess("Crawl completed! Added " + articles.size() + " articles.");
}
}

5
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,7 +16,7 @@ public class ExitCommand implements Command {
}
@Override
public void execute(String[] args, List<Article> articles) {
public void execute(String[] args, ArticleRepository repository) {
view.printSuccess("Bye!");
System.exit(0);
}

5
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<Article> articles) {
public void execute(String[] args, ArticleRepository repository) {
view.printInfo("Commands: crawl <url>, list, history, help, exit");
}
}

7
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<String> history;
@ -19,7 +20,7 @@ public class HistoryCommand implements Command {
}
@Override
public void execute(String[] args, List<Article> articles) {
public void execute(String[] args, ArticleRepository repository) {
if (history.isEmpty()) {
view.printInfo("暂无命令历史");
return;

14
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<Article> articles) {
view.display(articles);
public void execute(String[] args, ArticleRepository repository) {
List<Article> 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());
}
}
}

25
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<String, Command> commands = new HashMap<>();
private final ConsoleView view;
private final List<Article> articles;
private final ArticleRepository repository;
private final List<String> history = new ArrayList<>();
private HistoryCommand historyCommand;
public CrawlerController(ConsoleView view, List<Article> 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);
}
}

42
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<Article> articles = new ArrayList<>();
public void add(Article article) {
if (article != null) {
articles.add(article);
}
}
public void addAll(List<Article> newArticles) {
if (newArticles != null && !newArticles.isEmpty()) {
articles.addAll(newArticles);
}
}
public List<Article> getAll() {
return Collections.unmodifiableList(articles);
}
public Optional<Article> findByTitle(String title) {
return articles.stream()
.filter(a -> a.getTitle().equals(title))
.findFirst();
}
public int count() {
return articles.size();
}
public void clear() {
articles.clear();
}
}

10
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<Article> crawl(String url);
}

22
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<Article> crawl(String url) {
List<Article> 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;
}
}

43
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<Article> crawl(String url) {
List<Article> 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;
}
}
}

41
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<String, CrawlStrategy> 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());
}
}
Loading…
Cancel
Save