java: Composite Pattern
·
项目结构:

/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 21:56
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : AbstractProcessNode.java
* explain : 学习 类
**/
package CompositePattern.core.composite;
import CompositePattern.core.exception.BusinessProcessException;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.List;
/**
* 业务叶子节点抽象基类
* 封装公共日志、节点名称;默认实现叶子节点不支持子节点操作
* 所有12个业务叶子节点继承此类,对齐C# AbstractProcessNode
*/
public abstract class AbstractProcessNode implements IBusinessProcessNode {
/**
* 当前业务节点名称
*/
private final String nodeName;
/**
* 节点专属日志实例,DI注入隔离日志分类
*/
protected final Logger log;
/**
* 构造函数注入日志与节点名称
* @param log 当前类专属日志
* @param nodeName 业务节点中文名称
*/
protected AbstractProcessNode(Logger log, String nodeName) {
this.log = log;
this.nodeName = nodeName;
}
@Override
public String getNodeName() {
return this.nodeName;
}
/**
* 子类重写:实现当前节点专属业务逻辑
* @param businessOrderNo 业务单号
*/
@Override
public abstract void execute(String businessOrderNo);
/**
* 叶子节点默认实现:不支持添加子流程,抛出业务异常
*/
@Override
public void addChild(IBusinessProcessNode childNode) {
String errorMsg = String.format("叶子业务节点【%s】不支持挂载子业务流程", nodeName);
log.warn(errorMsg);
throw new BusinessProcessException(errorMsg, "未知", nodeName);
}
/**
* 叶子节点默认实现:无下属子流程,移除操作抛出异常
*/
@Override
public void removeChild(IBusinessProcessNode childNode) {
String errorMsg = String.format("叶子业务节点【%s】无下属子流程,无法移除", nodeName);
log.warn(errorMsg);
throw new BusinessProcessException(errorMsg, "未知", nodeName);
}
/**
* 叶子节点无任何子节点,返回空集合
*/
@Override
public List<IBusinessProcessNode> getChildren() {
return new ArrayList<>();
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 21:55
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : IBusinessProcessNode.java
* explain : 学习 类
**/
package CompositePattern.core.composite;
import java.util.List;
/**
* 组合模式顶层抽象构件接口
* 所有叶子业务节点、分组组合节点统一实现该接口
* 对外提供统一执行、增删子节点标准方法,完全对齐C# IBusinessProcessNode
*/
public interface IBusinessProcessNode {
/**
* 获取当前业务节点中文名称
* @return 节点名称
*/
String getNodeName();
/**
* 执行业务流程逻辑
* @param businessOrderNo 业务唯一订单编号
*/
void execute(String businessOrderNo);
/**
* 添加子业务节点
* 叶子节点实现抛出不支持异常;组合节点实现挂载子流程
* @param childNode 待添加子节点
*/
void addChild(IBusinessProcessNode childNode);
/**
* 移除指定子业务节点
* @param childNode 待移除子节点
*/
void removeChild(IBusinessProcessNode childNode);
/**
* 获取当前节点下全部子节点快照(线程安全副本,避免并发遍历冲突)
* @return 子节点集合
*/
List<IBusinessProcessNode> getChildren();
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 21:57
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : ProcessCompositeNode.java
* explain : 学习 类
**/
package CompositePattern.core.composite;
import CompositePattern.core.exception.BusinessProcessException;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 组合模式容器节点(Composite)
* 用于分组管理多个子业务节点(叶子/其他组合节点)
* 内部集合操作加同步锁,保证多线程并发增删子节点线程安全,对齐C# ProcessCompositeNode
*/
public class ProcessCompositeNode implements IBusinessProcessNode {
/**
* 分组节点名称
*/
private final String nodeName;
/**
* 分组专属日志
*/
protected final Logger log;
/**
* 子节点存储集合
*/
private final List<IBusinessProcessNode> childNodes;
/**
* 线程安全同步锁对象
*/
private final Object syncLock;
/**
* 构造组合分组节点
* @param log 分组日志实例
* @param groupName 分组中文名称
*/
public ProcessCompositeNode(Logger log, String groupName) {
this.log = log;
this.nodeName = groupName;
this.childNodes = new ArrayList<>();
this.syncLock = new Object();
}
@Override
public String getNodeName() {
return this.nodeName;
}
/**
* 批量顺序执行分组下所有子业务流程
* 单个子流程异常仅记录日志,不阻断同组其他流程执行
* @param businessOrderNo 业务单号
*/
@Override
public void execute(String businessOrderNo) {
log.info("===== 开始执行业务分组【{}】,业务单号:{} =====", nodeName, businessOrderNo);
List<IBusinessProcessNode> snapshot;
synchronized (syncLock) {
snapshot = new ArrayList<>(childNodes);
}
for (IBusinessProcessNode child : snapshot) {
try {
child.execute(businessOrderNo);
} catch (BusinessProcessException busEx) {
log.error("分组【{}】子节点【{}】业务异常,单号:{}",
nodeName, child.getNodeName(), businessOrderNo, busEx);
} catch (Throwable ex) {
log.error("分组【{}】子节点【{}】系统未知异常,单号:{}",
nodeName, child.getNodeName(), businessOrderNo, ex);
}
}
log.info("===== 业务分组【{}】全部子流程执行完毕,业务单号:{} =====", nodeName, businessOrderNo);
}
/**
* 同步锁保护,线程安全添加子节点
* @param childNode 待挂载子流程
*/
@Override
public void addChild(IBusinessProcessNode childNode) {
synchronized (syncLock) {
childNodes.add(childNode);
log.debug("分组【{}】成功挂载子节点:{}", nodeName, childNode.getNodeName());
}
}
/**
* 同步锁保护,线程安全移除子节点
* @param childNode 待移除子流程
*/
@Override
public void removeChild(IBusinessProcessNode childNode) {
synchronized (syncLock) {
boolean removeResult = childNodes.remove(childNode);
if (removeResult) {
log.debug("分组【{}】移除子节点:{}", nodeName, childNode.getNodeName());
} else {
log.debug("分组【{}】未找到目标子节点【{}】,无需移除", nodeName, childNode.getNodeName());
}
}
}
/**
* 返回不可修改子节点快照副本,避免外部遍历锁竞争
*/
@Override
public List<IBusinessProcessNode> getChildren() {
synchronized (syncLock) {
return Collections.unmodifiableList(new ArrayList<>(childNodes));
}
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 21:54
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : BusinessProcessException.java
* explain : 学习 类
**/
package CompositePattern.core.exception;
/**
* 珠宝业务流程全局自定义异常
* 区分业务校验错误与系统底层异常,日志可单独识别业务单据信息
* 对齐C# BusinessProcessException
*/
public class BusinessProcessException extends RuntimeException {
/**
* 关联业务订单号
*/
private final String businessOrderNo;
/**
* 异常所属业务节点名称
*/
private final String processNodeName;
/**
* 构造基础业务异常
* @param message 异常描述信息
* @param businessOrderNo 业务单号
* @param processNodeName 出错节点名称
*/
public BusinessProcessException(String message, String businessOrderNo, String processNodeName) {
super(message);
this.businessOrderNo = businessOrderNo;
this.processNodeName = processNodeName;
}
/**
* 带原始堆栈的业务异常构造
* @param message 异常描述
* @param cause 原始异常对象
* @param businessOrderNo 业务单号
* @param processNodeName 出错节点名称
*/
public BusinessProcessException(String message, Throwable cause, String businessOrderNo, String processNodeName) {
super(message, cause);
this.businessOrderNo = businessOrderNo;
this.processNodeName = processNodeName;
}
public String getBusinessOrderNo() {
return businessOrderNo;
}
public String getProcessNodeName() {
return processNodeName;
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:20
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : AdminSupportComposite.java
* explain : 学习 类
**/
package CompositePattern.business.compositegroup;
import CompositePattern.core.composite.ProcessCompositeNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 业务分组组合节点:职能后台支撑链路
* 包含:财务、人事行政、IT、培训后台职能节点
*/
public class AdminSupportComposite extends ProcessCompositeNode {
private static final Logger log = LoggerFactory.getLogger(AdminSupportComposite.class);
public AdminSupportComposite() {
super(log, "职能后台支撑链路");
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:20
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : ProduceLinkComposite.java
* explain : 学习 类
**/
package CompositePattern.business.compositegroup;
import CompositePattern.core.composite.ProcessCompositeNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 业务分组组合节点:生产制造核心链路
* 包含:原料采购、设计、加工、质检、包装、物流全生产流程
*/
public class ProduceLinkComposite extends ProcessCompositeNode {
private static final Logger log = LoggerFactory.getLogger(ProduceLinkComposite.class);
public ProduceLinkComposite() {
super(log, "生产制造链路");
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:04
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : SaleLinkComposite.java
* explain : 学习 类
**/
package CompositePattern.business.compositegroup;
import CompositePattern.core.composite.ProcessCompositeNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 业务分组组合节点:前端销售链路
* 包含:业务销售、营销推广两个叶子节点
*/
public class SaleLinkComposite extends ProcessCompositeNode {
private static final Logger log = LoggerFactory.getLogger(SaleLinkComposite.class);
public SaleLinkComposite() {
super(log, "前端销售链路");
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:02
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : BusinessSaleNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:业务销售
* 业务职责:客户洽谈、定制需求录入、销售订单合同建档
*/
public class BusinessSaleNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(BusinessSaleNode.class);
public BusinessSaleNode() {
super(log, "业务");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】客户订单建档流程启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】录入客户定制参数、签订销售合同、创建业务订单档案", getNodeName(), businessOrderNo);
log.debug("【{}】业务销售流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 21:59
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : DesignDrawNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:设计制图
* 业务职责:首饰3D建模、效果图渲染、生产图纸导出、方案归档
*/
public class DesignDrawNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(DesignDrawNode.class);
public DesignDrawNode() {
super(log, "设计制图");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】首饰3D建模设计启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】完成款式建模、尺寸标注、客户效果图渲染导出", getNodeName(), businessOrderNo);
log.info("【{}】图纸归档至设计资源库,下发至生产车间", getNodeName(), businessOrderNo);
log.debug("【{}】设计制图流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:02
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : FinanceNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:财务
* 业务职责:订单成本归集、销售开票、应收应付台账记账
*/
public class FinanceNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(FinanceNode.class);
public FinanceNode() {
super(log, "财务");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】订单成本核算流程启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】归集原料、加工、物流成本,开具销售发票,更新应收台账", getNodeName(), businessOrderNo);
log.debug("【{}】财务核算流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:03
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : HrAdminNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:人事行政
* 业务职责:车间工序工时统计、生产员工绩效台账更新
*/
public class HrAdminNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(HrAdminNode.class);
public HrAdminNode() {
super(log, "人事行政");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】订单对应生产人员绩效统计启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】统计各工序工时,更新车间员工绩效台账记录", getNodeName(), businessOrderNo);
log.debug("【{}】人事行政流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:03
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : ItSystemNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:IT运维
* 业务职责:订单业务数据备份、数据库归档、系统日志巡检
*/
public class ItSystemNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(ItSystemNode.class);
public ItSystemNode() {
super(log, "IT");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】业务订单数据备份校验启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】完成订单业务数据归档、数据库备份完整性校验", getNodeName(), businessOrderNo);
log.debug("【{}】IT运维流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:01
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : LogisticsNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:物流
* 业务职责:珠宝保价快递、物流单生成、配送跟踪台账登记
*/
public class LogisticsNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(LogisticsNode.class);
public LogisticsNode() {
super(log, "物流");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】保价发货流程启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】生成珠宝保价快递单据,录入物流跟踪管理台账", getNodeName(), businessOrderNo);
log.debug("【{}】物流流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 21:59
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : ManufactureNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:加工生产
* 业务职责:失蜡铸造、宝石镶嵌、粗抛、精抛车间工序流转
*/
public class ManufactureNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(ManufactureNode.class);
public ManufactureNode() {
super(log, "加工生产");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】车间生产排产启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】执行铸造、镶嵌、粗抛、精抛全生产工序", getNodeName(), businessOrderNo);
log.info("【{}】半成品流转至成品质检工位", getNodeName(), businessOrderNo);
log.debug("【{}】加工生产流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:02
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : MarketingNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:营销推广
* 业务职责:客户会员积分、用户标签、营销活动数据统计归档
*/
public class MarketingNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(MarketingNode.class);
public MarketingNode() {
super(log, "营销推广");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】订单客户营销数据归档启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】发放客户会员积分,更新客户用户标签,统计活动转化数据", getNodeName(), businessOrderNo);
log.debug("【{}】营销推广流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:01
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : PackNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:包装
* 业务职责:礼盒封装、配套证书、防尘防护、防伪封签粘贴
*/
public class PackNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(PackNode.class);
public PackNode() {
super(log, "包装");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】成品打包作业启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】首饰礼盒封装、配套证书放置、防伪封签粘贴完成", getNodeName(), businessOrderNo);
log.debug("【{}】包装流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:00
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : QualityCheckNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:质检
* 业务职责:重量、贵金属纯度、镶嵌牢固度、外观瑕疵全项检测
*/
public class QualityCheckNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(QualityCheckNode.class);
public QualityCheckNode() {
super(log, "质检");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】成品综合检测启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】称重、纯度检测、宝石牢固度、外观瑕疵逐项校验", getNodeName(), businessOrderNo);
log.info("【{}】合格品粘贴防伪证书,不良品标记退回车间返工", getNodeName(), businessOrderNo);
log.debug("【{}】质检流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 21:58
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : RawMaterialPurchaseNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import CompositePattern.core.exception.BusinessProcessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:原料采购核验
* 业务职责:贵金属/宝石原料入库、资质核验、库存台账登记
*/
public class RawMaterialPurchaseNode extends AbstractProcessNode {
// 日志由静态工厂创建,Guice DI自动管理单例
private static final Logger log = LoggerFactory.getLogger(RawMaterialPurchaseNode.class);
public RawMaterialPurchaseNode() {
super(log, "原料采购核验");
}
/**
* 执行原料采购核验完整业务流程
* @param businessOrderNo 珠宝业务订单编号
*/
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】原料入库校验流程启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】核验贵金属纯度报告、宝石鉴定证书、供应商资质文件", getNodeName(), businessOrderNo);
// 模拟异常分支:订单后缀带ERR代表原料资质缺失
if (businessOrderNo.toUpperCase().endsWith("ERR")) {
String errMsg = "原料配套鉴定证书缺失,无法入库,需退回供应商重新提供";
log.warn("【{}】业务校验失败:{},订单号:{}", getNodeName(), errMsg, businessOrderNo);
throw new BusinessProcessException(errMsg, businessOrderNo, getNodeName());
}
log.info("【{}】原料入库台账录入完成,原料库存数据同步更新", getNodeName(), businessOrderNo);
log.debug("【{}】原料采购核验流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:04
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : TrainNode.java
* explain : 学习 类
**/
package CompositePattern.business.node;
import CompositePattern.core.composite.AbstractProcessNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 叶子业务节点:员工培训
* 业务职责:新款工艺培训台账、质检标准培训记录归档
*/
public class TrainNode extends AbstractProcessNode {
private static final Logger log = LoggerFactory.getLogger(TrainNode.class);
public TrainNode() {
super(log, "培训");
}
@Override
public void execute(String businessOrderNo) {
log.debug("【{}】新款工艺培训台账归档启动,订单号:{}", getNodeName(), businessOrderNo);
log.info("【{}】更新新款首饰工艺、质检标准培训记录台账", getNodeName(), businessOrderNo);
log.debug("【{}】员工培训流程执行完毕,订单号:{}", getNodeName(), businessOrderNo);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:21
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : JewelryBusinessScheduler.java
* explain : 学习 类
**/
package CompositePattern.business.scheduler;
import CompositePattern.business.compositegroup.AdminSupportComposite;
import CompositePattern.business.compositegroup.ProduceLinkComposite;
import CompositePattern.business.compositegroup.SaleLinkComposite;
import CompositePattern.business.node.*;
import CompositePattern.core.composite.ProcessCompositeNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class JewelryBusinessScheduler {
private static final Logger log = LoggerFactory.getLogger(JewelryBusinessScheduler.class);
private final ProcessCompositeNode rootBusinessComposite;
private final BusinessSaleNode saleNode;
private final RawMaterialPurchaseNode materialNode;
private final DesignDrawNode designNode;
private final ManufactureNode manufactureNode;
private final QualityCheckNode qualityNode;
private final PackNode packNode;
private final LogisticsNode logisticsNode;
private final FinanceNode financeNode;
private final MarketingNode marketingNode;
private final HrAdminNode hrNode;
private final ItSystemNode itNode;
private final TrainNode trainNode;
private final SaleLinkComposite saleComposite;
private final ProduceLinkComposite produceComposite;
private final AdminSupportComposite adminComposite;
public JewelryBusinessScheduler() {
Logger rootLog = LoggerFactory.getLogger(ProcessCompositeNode.class);
this.rootBusinessComposite = new ProcessCompositeNode(rootLog, "珠宝全业务总流程根节点");
this.saleNode = new BusinessSaleNode();
this.materialNode = new RawMaterialPurchaseNode();
this.designNode = new DesignDrawNode();
this.manufactureNode = new ManufactureNode();
this.qualityNode = new QualityCheckNode();
this.packNode = new PackNode();
this.logisticsNode = new LogisticsNode();
this.financeNode = new FinanceNode();
this.marketingNode = new MarketingNode();
this.hrNode = new HrAdminNode();
this.itNode = new ItSystemNode();
this.trainNode = new TrainNode();
this.saleComposite = new SaleLinkComposite();
this.produceComposite = new ProduceLinkComposite();
this.adminComposite = new AdminSupportComposite();
}
public void initFullBusinessTreeStructure() {
log.info("调度器开始初始化珠宝全业务组合树形结构");
saleComposite.addChild(saleNode);
saleComposite.addChild(marketingNode);
produceComposite.addChild(materialNode);
produceComposite.addChild(designNode);
produceComposite.addChild(manufactureNode);
produceComposite.addChild(qualityNode);
produceComposite.addChild(packNode);
produceComposite.addChild(logisticsNode);
adminComposite.addChild(financeNode);
adminComposite.addChild(hrNode);
adminComposite.addChild(itNode);
adminComposite.addChild(trainNode);
rootBusinessComposite.addChild(saleComposite);
rootBusinessComposite.addChild(produceComposite);
rootBusinessComposite.addChild(adminComposite);
log.info("珠宝全业务树形组合结构初始化完成");
}
public void runSingleOrderFullProcess(String orderNo) {
log.info("调度器启动单订单完整业务流程,订单号:{}", orderNo);
try {
rootBusinessComposite.execute(orderNo);
log.info("调度器单订单全部业务流程执行完成,订单号:{}", orderNo);
} catch (Throwable ex) {
log.error("调度器顶层捕获订单全局未知异常,订单号:{}", orderNo, ex);
}
}
public void runMultiThreadBatchProcess(List<String> orderNoList) {
if (orderNoList == null || orderNoList.isEmpty()) {
log.warn("批量订单集合为空,跳过并发调度");
return;
}
log.info("调度器启动多线程高并发批量业务执行,待处理订单总数:{}", orderNoList.size());
ExecutorService executor = Executors.newFixedThreadPool(orderNoList.size());
for (String orderCode : orderNoList) {
executor.submit(() -> runSingleOrderFullProcess(orderCode));
}
executor.shutdown();
try {
if (!executor.awaitTermination(10, TimeUnit.MINUTES)) {
log.warn("批量任务执行超时,强制关闭线程池");
executor.shutdownNow();
}
} catch (InterruptedException e) {
log.error("批量调度线程被中断", e);
Thread.currentThread().interrupt();
}
log.info("多线程批量全部订单业务流程执行完毕");
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/17 - 22:22
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : BusinessModule.java
* explain : 学习 类
**/
package CompositePattern.config;
import CompositePattern.business.compositegroup.AdminSupportComposite;
import CompositePattern.business.compositegroup.ProduceLinkComposite;
import CompositePattern.business.compositegroup.SaleLinkComposite;
import CompositePattern.business.node.*;
import CompositePattern.business.scheduler.JewelryBusinessScheduler;
import CompositePattern.core.composite.ProcessCompositeNode;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Guice DI模块,一次性注册所有业务、组合、调度单例服务
* 对齐.NET ServiceCollectionExtensions,统一管理依赖注册
*/
public class BusinessModule extends AbstractModule {
private static final Logger log = LoggerFactory.getLogger(BusinessModule.class);
@Override
protected void configure() {
// 绑定12个叶子业务节点为单例
bind(RawMaterialPurchaseNode.class).asEagerSingleton();
bind(DesignDrawNode.class).asEagerSingleton();
bind(ManufactureNode.class).asEagerSingleton();
bind(QualityCheckNode.class).asEagerSingleton();
bind(PackNode.class).asEagerSingleton();
bind(LogisticsNode.class).asEagerSingleton();
bind(FinanceNode.class).asEagerSingleton();
bind(MarketingNode.class).asEagerSingleton();
bind(BusinessSaleNode.class).asEagerSingleton();
bind(HrAdminNode.class).asEagerSingleton();
bind(ItSystemNode.class).asEagerSingleton();
bind(TrainNode.class).asEagerSingleton();
// 绑定三大业务分组组合节点
bind(SaleLinkComposite.class).asEagerSingleton();
bind(ProduceLinkComposite.class).asEagerSingleton();
bind(AdminSupportComposite.class).asEagerSingleton();
// 调度器单例
bind(JewelryBusinessScheduler.class).asEagerSingleton();
}
/**
* 提供全局根组合节点单例
*/
@Provides
public ProcessCompositeNode provideRootCompositeNode() {
Logger rootLog = LoggerFactory.getLogger(ProcessCompositeNode.class);
return new ProcessCompositeNode(rootLog, "珠宝全业务总流程根节点");
}
}
调用:
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/5 - 11:02
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : CompositeBll.java
* explain : 学习 类
**/
package BLL;
import CompositePattern.business.scheduler.JewelryBusinessScheduler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class CompositeBll {
private static final Logger log = LoggerFactory.getLogger(CompositeBll.class);
public void demo(){
JewelryBusinessScheduler scheduler = new JewelryBusinessScheduler();
scheduler.initFullBusinessTreeStructure();
log.info("========== 珠宝企业级组合模式业务系统启动完成 ==========");
String normalOrder = "JEW20260717001";
scheduler.runSingleOrderFullProcess(normalOrder);
String errorOrder = "JEW20260717002-ERR";
scheduler.runSingleOrderFullProcess(errorOrder);
List<String> batchOrderList = List.of(
"JEW20260717003",
"JEW20260717004",
"JEW20260717005",
"JEW20260717006"
);
scheduler.runMultiThreadBatchProcess(batchOrderList);
log.info("========== 全部业务流程测试执行结束,程序退出 ==========");
}
}
输出:

展示了一个基于组合模式(Composite Pattern)的珠宝企业级业务系统实现。系统通过抽象构件接口IBusinessProcessNode统一管理业务节点,包含12个叶子节点(如原料采购、设计制图、加工生产等)和3个组合节点(销售链路、生产制造链路、职能支撑链路)。核心类AbstractProcessNode和ProcessCompositeNode分别实现叶子节点和组合节点的通用逻辑,支持线程安全的子节点管理。JewelryBusinessScheduler作为调度器,可执行单订单全流程或多线程批量处理。系统采用Guice进行依赖注入,并通过SLF4J实现详细日志记录,完整模拟了珠宝行业从销售到生产的全业务流程,包括异常处理和并发控制。
更多推荐



所有评论(0)