组合模式(Composite Pattern): 在线教育平台课程管理实战案例分析

肖哥弹架构 跟大家"弹弹" 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

在线教育平台提供了各种类型的课程,包括单个视频课程、文档课程,以及由多个小课程组成的组合课程。这些课程在功能上需要一致性,例如:课程价格,课程展示。

2. 为什么要使用组合设计模式

组合模式允许将对象组合成树状结构,以表示"部分-整体"的层次关系,使得用户可以一致地对待单个对象和组合对象。

3. 标准组合设计模式图

4. 业务组合设计模式图

5. 业务代码参考

Java 复制代码
import java.util.ArrayList;
import java.util.List;

// 课程项接口,定义了课程项的基本操作
interface CourseItem {
    void display(int depth);
    double cost();
}

// 叶子节点:视频课程
class VideoCourse implements CourseItem {
    private String title;
    private double price;

    public VideoCourse(String title, double price) {
        this.title = title;
        this.price = price;
    }

    @Override
    public void display(int depth) {
        String indent = "  ".repeat(depth);
        System.out.println(indent + title + " - ¥" + price);
    }

    @Override
    public double cost() {
        return price;
    }
}

// 叶子节点:文档课程
class DocumentCourse implements CourseItem {
    private String title;
    private double price;

    public DocumentCourse(String title, double price) {
        this.title = title;
        this.price = price;
    }

    @Override
    public void display(int depth) {
        String indent = "  ".repeat(depth);
        System.out.println(indent + title + " - ¥" + price);
    }

    @Override
    public double cost() {
        return price;
    }
}

// 组合节点:课程包
class CourseBundle implements CourseItem {
    private List<CourseItem> courses = new ArrayList<>();

    public void addCourseItem(CourseItem course) {
        courses.add(course);
    }

    public void removeCourseItem(CourseItem course) {
        courses.remove(course);
    }

    @Override
    public void display(int depth) {
        String indent = "  ".repeat(depth);
        System.out.println(indent + "Course Bundle - Contains " + courses.size() + " items");
        for (CourseItem course : courses) {
            course.display(depth + 1);
        }
    }

    @Override
    public double cost() {
        double totalCost = 0;
        for (CourseItem course : courses) {
            totalCost += course.cost();
        }
        return totalCost;
    }
}

// 客户端使用
class OnlineEducationPlatform {
    public static void main(String[] args) {
        // 创建单个课程
        CourseItem javaBasicsVideo = new VideoCourse("Java 课", 199.99);
        CourseItem pythonBasicsVideo = new DocumentCourse("Python课 ", 149.99);

        // 创建课程包
        CourseItem beginnerBundle = new CourseBundle();
        beginnerBundle.addCourseItem(javaBasicsVideo);
        beginnerBundle.addCourseItem(pythonBasicsVideo);

        // 显示课程包内容及价格
        beginnerBundle.display(0);
        System.out.println("课程包价格: ¥" + beginnerBundle.cost());
    }
}

6. 使用组合设计模式的好处

组合模式解决了以下问题:

  • 统一接口:使得单个课程和组合课程有统一的接口。
  • 灵活性:可以灵活地添加或删除课程。
  • 扩展性:易于添加新的课程类型。

7. 其他使用组合设计模式场景参考

组合模式适用于需要表示部分-整体层次结构的场景,例如:

  • 组织结构管理:如公司部门和员工的管理。
  • 文件系统:如文件和文件夹的管理。

8. 可参考开源框架

  • Apache Wicket:在构建Web应用程序时,使用组合模式来创建组件层次结构。

总结

组合模式通过将对象组合成树状结构,提供了一种灵活的方式来管理层次化的数据结构,使得用户可以一致地对待单个对象和组合对象。

历史热点文章

相关推荐
无名之逆3 分钟前
[特殊字符] Hyperlane 框架:高性能、灵活、易用的 Rust 微服务解决方案
运维·服务器·开发语言·数据库·后端·微服务·rust
Asthenia041217 分钟前
面试回顾:Java RMI 问题解析
后端
ohMyGod_12320 分钟前
用React实现一个秒杀倒计时组件
前端·javascript·react.js
uhakadotcom23 分钟前
Python 中的 @staticmethod 和 @classmethod 详解
后端·面试·github
eternal__day23 分钟前
第三期:深入理解 Spring Web MVC [特殊字符](数据传参+ 特殊字符处理 + 编码问题解析)
java·前端·spring·java-ee·mvc
congregalis27 分钟前
跳出框架:一步步实现简易Deep Search Agent
人工智能·程序员·源码
醋醋29 分钟前
Vue2源码记录
前端·vue.js
uhakadotcom36 分钟前
单点登录的两大核心技术:SAML和OIDC
后端·面试·github
江耳41 分钟前
从10秒到无限流:我用Vercel+NextJS实现AI流式对话遇到的超时问题及解决方案
前端
总之就是非常可爱1 小时前
三分钟让你看懂alien-signals computed基本原理
前端