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

总结

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

历史热点文章

相关推荐
CodeSheep3 分钟前
“渐渐能理解为何不愿意雇佣35岁以上程序猿。去年换了份工作,组里4位组员其中3位40+,发现其实最大的问题并不是说精力不济卷不动”
前端·后端·程序员
摸鱼的春哥20 分钟前
【实战】吃透龙虾🦞,你写的Agent也能支持Skills渐进式披露
前端·javascript·后端
恋猫de小郭33 分钟前
你还用 IDE 吗? AI 狂欢时代下 Cursor 慌了, JetBrains 等 IDE 的未来是什么?
前端·flutter·ai编程
明月_清风37 分钟前
从“能用”到“专业”:构建生产级装饰器与三层逻辑拆解
后端·python
明月_清风39 分钟前
拒绝盲目 Git:VS Code 神级插件 GitLens 的 9 个进效杀手锏
前端·git
孟祥_成都41 分钟前
用 AI,0 基础复刻网页顶级特效!😀
前端·javascript·vibecoding
万少8 小时前
小龙虾(openclaw),轻松玩转自动发帖
前端·人工智能·后端
Jagger_9 小时前
抱怨到躺床关灯的一次 DIY 记录
前端
KaneLogger9 小时前
AI 时代编程范式迁移的思考
人工智能·程序员·代码规范
Jagger_9 小时前
AI 洪水淹到脖子了:剩下的是什么?我们该往哪儿跑?
后端