当前位置: 首页 > news >正文

复合模式(Composite Pattern)

1. 接口(GradedItem)

接口是一个契约,规定了所有实现该接口的类必须提供的方法。

GradedItem.java 定义了一个所有可分级项都必须实现的接口,即 getScore() 方法。这意味着任何实现 GradedItem 的类都必须提供获取分数的功能。

public interface GradedItem {double getScore();}

2. 叶子组件(Task 类)

叶子组件是最基本的单元,不能再被分解。

Task.java 是一个简单的任务类,它实现了 GradedItem 接口。

构造方法 初始化任务的名称和分数。

getScore() 方法实现了接口中的方法,直接返回任务的分数。

getName() 是一个辅助方法,返回任务的名称。

public class Task implements GradedItem {private String name;private double score;public Task(String name, double score) {this.name = name;this.score = score;}@Overridepublic double getScore() {return this.score;}public String getName() {return this.name;}}

3. 复合组件(CompositeTask 类)

复合组件是包含其他组件(可能是叶子或其他复合组件)的容器。

CompositeTask.java 是一个复合任务类,它也实现了 GradedItem 接口。

构造方法 初始化复合任务的名称。

addTask() 和 removeTask() 用于管理子任务的添加和删除。

getScore() 方法实现了接口中的方法,但它通过递归调用所有子任务的 getScore() 方法来计算总分。

showStructure() 是一个辅助方法,用于打印任务结构和分数。

public class CompositeTask implements GradedItem {private String name;private List<GradedItem> items = new ArrayList<>();public CompositeTask(String name) {this.name = name;}public void addTask(GradedItem item) {items.add(item);}public void removeTask(GradedItem item) {items.remove(item);}@Overridepublic double getScore() {double total = 0;for (GradedItem item : items) {total += item.getScore();}return total;}public void showStructure(String indent) {System.out.println(indent + "- " + name + " (Total: " + getScore() + ")");for (GradedItem item : items) {if (item instanceof CompositeTask) {((CompositeTask) item).showStructure(indent + "  ");} else {System.out.println(indent + "  - " + ((Task) item).getName() + ": " + item.getScore());}}}}

4. 测试类(CompositePatternTest 类)

测试类用于展示如何使用这些组件来构建任务的层次结构,并计算总分。

创建单一任务:创建几个简单的 Task 对象,每个任务都有名称和分数。

创建复合任务:创建 CompositeTask 对象,并将任务(可以是单一任务或其他复合任务)添加到其中。

显示结构和总分:调用 showStructure() 方法打印任务的层次结构,并计算总分。

public class CompositePatternTest {public static void main(String[] args) {Task homework1 = new Task("Homework 1", 95.0);Task homework2 = new Task("Homework 2", 88.0);CompositeTask assignment1 = new CompositeTask("Assignment 1");assignment1.addTask(homework1);assignment1.addTask(homework2);Task quiz1 = new Task("Quiz 1", 92.0);Task quiz2 = new Task("Quiz 2", 85.0);CompositeTask assignment2 = new CompositeTask("Assignment 2");assignment2.addTask(quiz1);assignment2.addTask(quiz2);CompositeTask courseAssignments = new CompositeTask("Course Assignments");courseAssignments.addTask(assignment1);courseAssignments.addTask(assignment2);courseAssignments.showStructure("");System.out.println("\nTotal Course Score: " + courseAssignments.getScore());}}

总结

接口(GradedItem):定义了所有任务项的通用行为。

叶子组件(Task):表示一个简单的任务,不能再分解。

复合组件(CompositeTask):表示一个可以包含其他任务(叶子或复合组件)的复合任务。

测试类(CompositePatternTest):展示如何使用这些组件来构建层次结构,并计算总分。

通过这种设计,client 可以以统一的方式处理单一任务和复合任务,无需关心具体是处理单个任务还是任务集合,这正是复合模式的核心思想。

相关文章:

  • 【Java开发日记】OpenFeign 的 9 个坑
  • Meta 推出 WebSSL 模型:探索 AI 无语言视觉学习,纯图训练媲美 OpenAI CLIP
  • 深入浅出限流算法(三):追求极致精确的滑动日志
  • leetcode283-移动零
  • 【神经网络与深度学习】两种加载 pickle 文件方式(joblib、pickle)的差异
  • uniapp自定义头部(兼容微信小程序(胶囊和状态栏),兼容h5)
  • 深度解析算法之分治(归并)
  • el-table 自定义列、自定义数据
  • 【网络编程】TCP/IP四层模型、MAC和IP
  • npm init、换源问题踩坑
  • 杰理-安卓通过map获取时间的时候,部分手机切换sbc和aac时候单耳无声音
  • redis+lua+固定窗口实现分布式限流
  • AcWing 885:求组合数 I ← 杨辉三角
  • seaborn数据统计可视化-介绍
  • 业绩回暖、股价承压,三只松鼠赴港上市能否重构价值锚点?
  • 道可云人工智能每日资讯|“人工智能科技体验展”在中国科学技术馆举行
  • GTC2025全球流量大会:领驭科技以AI云端之力,助力中国企业出海破浪前行
  • SECS-I vs HSMS-SS vs HSMS-GS 通信控制对比明细表
  • 可编程控制器应用
  • 《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》
  • 一周人物|卡鲁等入围英国特纳奖,李学明新展中国美术馆
  • 新剧|反谍大剧《绝密较量》央一开播,张鲁一高圆圆主演
  • 点燃“文化活火”,上海百年街区创新讲述“文化三地”故事
  • 51岁国家移民管理局移民事务服务中心联络部副主任林艺聪逝世
  • 清华数字政府与治理研究院揭牌:服务数字政府建设需求
  • 南阳市委原书记朱是西被“双开”:搞劳民伤财的“政绩工程”