You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
XuJingwang 84a1b42f7e 实验2-徐景旺-202414010701 1 week ago
..
analysis 实验2-徐景旺-202414010701 1 week ago
chart 实验2-徐景旺-202414010701 1 week ago
model 实验2-徐景旺-202414010701 1 week ago
spider 实验2-徐景旺-202414010701 1 week ago
ui 实验2-徐景旺-202414010701 1 week ago
utils 实验2-徐景旺-202414010701 1 week ago
MovieMain.java 实验2-徐景旺-202414010701 1 week ago
README.md 实验2-徐景旺-202414010701 1 week ago
pom.xml 实验2-徐景旺-202414010701 1 week ago

README.md

电影爬虫项目 - 继承与多态实现说明

项目简介

本项目是一个Java电影爬虫,从豆瓣电影Top250抓取数据,进行清洗、存储、分析,并生成多种图表展示结果。项目重点展示了面向对象编程中继承多态的实现。

继承与多态实现

1. 接口继承

1.1 核心接口定义

文件: src/main/java/com/crawler/chart/ChartGenerator.java

public interface ChartGenerator {
    void generateChart(Movie[] movies);
    String getChartName();
}

1.2 实现类继承

实现类 文件位置 继承关系
RatingDistributionChartGenerator src/main/java/com/crawler/chart/impl/RatingDistributionChartGenerator.java 实现 ChartGenerator 接口
YearDistributionChartGenerator src/main/java/com/crawler/chart/impl/YearDistributionChartGenerator.java 实现 ChartGenerator 接口
GenreDistributionChartGenerator src/main/java/com/crawler/chart/impl/GenreDistributionChartGenerator.java 实现 ChartGenerator 接口
YearRatingChartGenerator src/main/java/com/crawler/chart/impl/YearRatingChartGenerator.java 实现 ChartGenerator 接口

2. 多态实现

2.1 向上转型(接口引用指向实现类)

文件: src/main/java/com/crawler/MovieMain.java (第41-44行)

ChartGenerator ratingChart = new RatingDistributionChartGenerator();
ChartGenerator yearChart = new YearDistributionChartGenerator();
ChartGenerator genreChart = new GenreDistributionChartGenerator();
ChartGenerator yearRatingChart = new YearRatingChartGenerator();

2.2 方法参数多态

文件: src/main/java/com/crawler/chart/ChartManager.java (第12-13行)

public void addChartGenerator(ChartGenerator generator) {
    chartGenerators.add(generator);
}

2.3 运行时多态(动态绑定)

文件: src/main/java/com/crawler/chart/ChartManager.java (第21-25行)

public void generateAllCharts(List<Movie> movies) {
    Movie[] movieArray = movies.toArray(new Movie[0]);
    for (ChartGenerator generator : chartGenerators) {
        System.out.println("生成图表: " + generator.getChartName());
        generator.generateChart(movieArray);  // 运行时根据实际类型调用对应方法
    }
}

2.4 统一调用接口

文件: src/main/java/com/crawler/MovieMain.java (第46-51行)

chartManager.addChartGenerator(ratingChart);
chartManager.addChartGenerator(yearChart);
chartManager.addChartGenerator(genreChart);
chartManager.addChartGenerator(yearRatingChart);

chartManager.generateAllCharts(cleanedMovies);

继承与多态的优势

  1. 代码复用:所有图表生成器共享相同的接口方法
  2. 可扩展性:新增图表类型只需实现接口,无需修改现有代码
  3. 统一管理ChartManager 可以统一管理不同类型的图表生成器
  4. 灵活性:通过接口引用可以操作不同的实现类对象
  5. 可维护性:代码结构清晰,职责分明

项目结构

src/
└── main/
    └── java/
        └── com/
            └── crawler/
                ├── MovieMain.java                # 主入口文件
                ├── model/
                │   └── Movie.java               # 电影数据模型
                ├── spider/
                │   └── DoubanSpider.java        # 豆瓣爬虫实现
                ├── analysis/
                │   └── MovieAnalyzer.java       # 数据分析工具
                ├── ui/
                │   └── MovieResultDisplay.java  # 结果显示和图表生成
                ├── utils/
                │   └── DataUtils.java           # 数据工具类
                └── chart/
                    ├── ChartGenerator.java      # 图表生成器接口
                    ├── ChartManager.java        # 图表管理器
                    └── impl/
                        ├── RatingDistributionChartGenerator.java    # 评分分布图表
                        ├── YearDistributionChartGenerator.java      # 年份分布图表
                        ├── GenreDistributionChartGenerator.java     # 类型分布图表
                        └── YearRatingChartGenerator.java           # 年份评分相关性图表

运行说明

  1. 直接运行:在IDE中直接运行 MovieMain.java
  2. 依赖要求:需要Jsoup和JFreeChart库
  3. 运行结果
    • 控制台输出爬取进度和图表生成信息
    • 生成的CSV数据文件保存在项目目录
    • 生成的图表以PNG格式保存在项目目录

技术栈

  • Java 8+
  • Jsoup (网页解析)
  • JFreeChart (图表生成)
  • Maven (依赖管理)

总结

本项目通过图表生成器接口及其实现类,充分展示了面向对象编程中继承多态的核心概念。接口定义了统一的方法规范,实现类提供了具体的实现逻辑,通过接口引用和运行时动态绑定,实现了代码的灵活性和可扩展性。