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

总结

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

历史热点文章

相关推荐
小云朵爱编程6 分钟前
Vue项目Iconify的使用以及自定义图标,封装图标选择器
前端·javascript·vue.js
前端大卫9 分钟前
CSS 属性值 initial、unset 和 revert 的解析
前端
n***840714 分钟前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
shimh_凉茶21 分钟前
webpack+vue2打包分析视图插件 webpack-bundle-analyzer
前端·webpack·node.js
P***253922 分钟前
JavaScript部署
开发语言·前端·javascript
一只小阿乐33 分钟前
react 状态管理mobx中的行为模式
前端·javascript·react.js·mobx·vue开发·react开发
l***O52035 分钟前
前端路由历史监听,React与Vue实现
前端·vue.js·react.js
超级战斗鸡37 分钟前
React 性能优化教程:useMemo 和 useCallback 的正确使用方式
前端·react.js·性能优化
bemyrunningdog37 分钟前
创建 React 项目指南:Vite 与 Create React App 详
前端·react.js·前端框架
大雷神1 小时前
DevUI 实战教程:从零构建电商后台管理系统(完整版)
前端·javascript·华为·angular.js