组合模式(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应用程序时,使用组合模式来创建组件层次结构。

总结

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

历史热点文章

相关推荐
gnip24 分钟前
企业级配置式表单组件封装
前端·javascript·vue.js
一只叫煤球的猫1 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9652 小时前
tcp/ip 中的多路复用
后端
bobz9652 小时前
tls ingress 简单记录
后端
excel2 小时前
Three.js 材质(Material)详解 —— 区别、原理、场景与示例
前端
掘金安东尼3 小时前
抛弃自定义模态框:原生Dialog的实力
前端·javascript·github
你的人类朋友3 小时前
什么是OpenSSL
后端·安全·程序员
bobz9653 小时前
mcp 直接操作浏览器
后端
前端小张同学6 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook6 小时前
Manim实现闪光轨迹特效
后端·python·动效