MST

星途 面试题库

面试题:Java领域驱动设计的聚合与仓储

在Java项目采用领域驱动设计时,描述聚合根、聚合以及仓储在领域模型中的作用。以一个在线教育系统为例,假设有课程聚合,包含课程、章节、视频等实体,设计课程聚合根以及对应的课程仓储接口,说明仓储接口中应该包含哪些核心方法,并解释为什么。
34.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

聚合根、聚合以及仓储在领域模型中的作用

  1. 聚合:聚合是一组相关对象的集合,它们作为一个整体被视为数据修改的原子单元。聚合内的对象通过内部一致性规则保持数据的完整性。例如在在线教育系统的课程聚合中,课程、章节、视频这些实体紧密相关,形成一个聚合,保证了课程相关数据操作的一致性。

  2. 聚合根:聚合根是聚合的入口点和管理者,它负责维护聚合内对象之间的关系,并对外提供操作聚合内对象的接口。在课程聚合中,课程可作为聚合根,因为课程管理着章节和视频的添加、删除等操作,外界对章节和视频的访问通常通过课程聚合根来进行。这有助于确保聚合内数据的一致性和完整性,防止外部对象绕过业务规则直接操作聚合内的对象。

  3. 仓储:仓储在领域模型中扮演着类似数据库访问抽象层的角色,它负责在持久化存储中存取聚合根及其相关对象。它提供了一种与具体数据存储技术无关的方式来进行数据操作。对于课程聚合,课程仓储负责课程聚合根的持久化和检索,使得领域层与数据访问层解耦,提高了代码的可维护性和可测试性。

课程聚合根设计

public class Course {
    private Long id;
    private String name;
    private List<Chapter> chapters;

    // 构造函数
    public Course(String name) {
        this.name = name;
        this.chapters = new ArrayList<>();
    }

    // 添加章节方法
    public void addChapter(Chapter chapter) {
        chapters.add(chapter);
    }

    // 删除章节方法
    public void removeChapter(Chapter chapter) {
        chapters.remove(chapter);
    }

    // Getter 和 Setter 方法
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Chapter> getChapters() {
        return chapters;
    }

    public void setChapters(List<Chapter> chapters) {
        this.chapters = chapters;
    }
}

课程仓储接口设计

public interface CourseRepository {
    // 保存课程方法
    void save(Course course);

    // 根据ID查找课程方法
    Course findById(Long id);

    // 删除课程方法
    void delete(Course course);
}

核心方法解释

  1. save(Course course):该方法用于将课程聚合根保存到持久化存储中。当课程对象的状态发生改变(如添加新章节、修改课程名称等),需要通过此方法将最新状态持久化,保证数据的一致性和持久性。

  2. findById(Long id):通过课程的唯一标识ID从持久化存储中检索课程聚合根。在业务逻辑中,经常需要根据特定的标识获取课程对象进行后续操作,如展示课程详情、修改课程信息等,此方法提供了这种数据检索的功能。

  3. delete(Course course):用于从持久化存储中删除课程聚合根及其相关联的所有对象(如章节、视频等,具体取决于数据删除策略)。当课程不再需要时,通过此方法将其从系统中移除,保证数据的准确性和一致性。