Java Composition在实际项目中的应用案例
一、概念澄清
二、项目落地案例
企业组织架构与权限聚合
场景:公司由部门(Composite)与员工(Leaf)构成,需要统一计算团队规模、汇总权限、批量下发通知。做法:抽象Employee接口,部门持有List
文件系统与目录同步工具
场景:实现跨平台目录同步/备份,需对“文件/文件夹”统一执行“遍历、计算大小、过滤、删除”。做法:抽象FileSystemComponent,文件夹Composite维护子节点集合,文件Leaf实现具体行为;一次递归即可完成整棵目录树操作。收益:对单文件与整目录调用一致,新增节点类型不影响遍历与统计逻辑。
图形界面组件树与渲染引擎
场景:桌面或Web应用需要嵌套组件(如JFrame → JPanel → JButton/JLabel)并统一处理布局、绘制、事件分发。做法:以UIComponent为抽象,容器组件维护子组件列表并递归布局/绘制;事件冒泡/捕获也可用同一树形结构处理。收益:UI结构可任意嵌套,代码对“单个控件/控件容器”一致处理。
报表引擎与可视化图表组合
场景:报表由标题、表格、图表、文本等模块组合,导出PDF/HTML/Excel或做权限控制。做法:抽象ReportComponent,容器CompositeReport聚合多模块,叶子如TableComponent/ChartComponent实现具体渲染;统一调用generate即可遍历整棵报表树。收益:新增模块类型不影响导出流程,权限与样式可按组件粒度控制。
规则引擎与审批流程编排
场景:审批流程由审批节点与条件/并行/子流程组合,需要校验、执行、回滚。做法:抽象FlowNode,组合节点维护子节点列表并定义execute/rollback的递归执行策略;条件节点内嵌子流程实现分支。收益:流程结构可配置、可复用,执行引擎与节点实现解耦。
三、何时优先使用组合
四、代码骨架示例(组合模式)
// 抽象构件
interface Component {
void operation();
}
// 叶子构件
class Leaf implements Component {
private final String name;
Leaf(String name) { this.name = name; }
public void operation() { System.out.println("Leaf " + name + " operation."); }
}
// 组合构件
class Composite implements Component {
private final String name;
private final java.util.List<Component> children = new java.util.ArrayList<>();
Composite(String name) { this.name = name; }
public void add(Component c) { children.add(c); }
public void remove(Component c) { children.remove(c); }
public void operation() {
System.out.println("Composite " + name + " operation.");
for (Component c : children) c.operation(); // 递归处理
}
}
// 客户端
class Demo {
public static void main(String[] args) {
Component root = new Composite("Root");
root.add(new Leaf("A"));
Component sub = new Composite("Sub");
sub.add(new Leaf("B1")); sub.add(new Leaf("B2"));
root.add(sub);
root.operation();
}
}
要点:抽象出Component统一接口;Composite持有子节点并递归执行;Leaf实现具体行为,不维护子节点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。