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

总结

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

历史热点文章

相关推荐
星辰中的维纳斯11 分钟前
vue新手入门教程(项目创建+组件导入+VueRouter)
前端·javascript·vue.js
施展TIGERB22 分钟前
程序员如何做"好"需求判断?
面试·程序员·团队管理
嫣嫣细语28 分钟前
css实现鼠标禁用(鼠标滑过显示红色禁止符号)
前端·css
Days205033 分钟前
web前端主要包括哪些技术
前端
续亮~1 小时前
6、Redis系统-数据结构-06-跳表
java·数据结构·数据库·redis·后端·缓存
XF鸭1 小时前
HTML-CSS 入门介绍
服务器·前端·javascript
五敷有你1 小时前
Go:hello world
开发语言·后端·golang
forwardMyLife2 小时前
element-plus 的form表单组件之el-radio(单选按钮组件)
前端·javascript·vue.js
拔剑纵狂歌2 小时前
Golang异常处理机制
开发语言·后端·golang·go
fs哆哆2 小时前
ExcelVBA运用Excel的【条件格式】(二)
linux·运维·服务器·前端·excel