java:Observer Pattern

一、项目概述

本文基于 Java 21 实现珠宝加工业务流程的观察者模式(Observer Pattern)实战案例,覆盖从原料采购、设计、加工、质检、包装、物流到财务的全流程事件驱动设计。

二、项目结构

项目采用模块化分包设计,核心包结构如下:

  • ObserverPattern.dto:业务数据传输对象,如 JewelryProcessDto。
  • ObserverPattern.observer:观察者模式核心,包含主题 ProcessSubject 与观察者接口 IProcessObserver。
  • ObserverPattern.observer.observers:各业务部门观察者实现,如采购核验、设计、加工、质检、包装、物流、财务、营销、人事、IT、培训等。
  • ObserverPattern.logging:日志组件,对标 .NET ILogger,支持控制台与文件输出。
  • ObserverPattern.scheduler:业务流程调度器 JewelryProcessScheduler,驱动业务流转。
  • ObserverPattern.di:轻量级依赖注入容器,非 Spring 实现。
  • ObserverPattern.circuit:熔断器相关异常定义。

三、核心设计

本案例以观察者模式为核心,主题对象 ProcessSubject 维护观察者列表,业务事件发生时通知所有已注册的观察者,实现业务模块之间的解耦。

四、数据模型

JewelryProcessDto 定义珠宝业务流程的核心字段,包括原料信息、采购核验、设计图纸、当前阶段、质检结果、订单金额、业务时间等。

五、日志组件

对标 .NET ILogger 的泛型日志体系,包含日志等级、控制台输出、文件输出、日志工厂等实现,支持多线程安全写入。

六、观察者实现

各业务部门观察者实现 IProcessObserver 接口,在收到业务事件后执行各自的业务逻辑,如采购核验、加工生产、质量检测、成品包装、物流出库、财务结算等。

七、调度与调用

JewelryProcessScheduler 作为业务流程调度器,驱动整个业务流转并触发观察者通知;ObserverBll 演示完整的组装与调用过程。

八、运行输出

展示案例运行后的控制台与文件日志输出效果,验证各观察者是否正确响应业务事件。

九、总结

总结观察者模式在珠宝加工业务流程中的应用价值,以及日志组件、DI 容器等配套设计的实践要点。

项目结构:

java 复制代码
     * 原料名称:钻石/红宝石/翡翠等
     */
    private String materialName;
/**
 * 原料重量 克拉
 */
private double weightCarat;

/**
 * 采购核验是否通过
 */
private boolean purchaseVerified;

/**
 * 设计图纸编号
 */
private String drawingNo;

/**
 * 当前流程阶段:采购|设计|加工|质检|包装|物流|财务
 */
private String currentStage;

/**
 * 质检结果
 */
private boolean qualityPass;

/**
 * 订单金额
 */
private BigDecimal orderAmount;

/**
 * 业务发生时间
 */
private LocalDateTime businessTime;

/**
 * 备注信息
 */
private String remark;

public String getProcessNo() {
    return processNo;
}

public void setProcessNo(String processNo) {
    this.processNo = processNo;
}

public String getMaterialCode() {
    return materialCode;
}

public void setMaterialCode(String materialCode) {
    this.materialCode = materialCode;
}

public String getMaterialName() {
    return materialName;
}

public void setMaterialName(String materialName) {
    this.materialName = materialName;
}

public double getWeightCarat() {
    return weightCarat;
}

public void setWeightCarat(double weightCarat) {
    this.weightCarat = weightCarat;
}

public boolean isPurchaseVerified() {
    return purchaseVerified;
}

public void setPurchaseVerified(boolean purchaseVerified) {
    this.purchaseVerified = purchaseVerified;
}

public String getDrawingNo() {
    return drawingNo;
}

public void setDrawingNo(String drawingNo) {
    this.drawingNo = drawingNo;
}

public String getCurrentStage() {
    return currentStage;
}

public void setCurrentStage(String currentStage) {
    this.currentStage = currentStage;
}

public boolean isQualityPass() {
    return qualityPass;
}

public void setQualityPass(boolean qualityPass) {
    this.qualityPass = qualityPass;
}

public BigDecimal getOrderAmount() {
    return orderAmount;
}

public void setOrderAmount(BigDecimal orderAmount) {
    this.orderAmount = orderAmount;
}

public LocalDateTime getBusinessTime() {
    return businessTime;
}

public void setBusinessTime(LocalDateTime businessTime) {
    this.businessTime = businessTime;
}

public String getRemark() {
    return remark;
}

public void setRemark(String remark) {
    this.remark = remark;
}

@Override
public String toString() {
    return "JewelryProcessDto{" +
            "processNo='" + processNo + '\'' +
            ", materialCode='" + materialCode + '\'' +
            ", materialName='" + materialName + '\'' +
            ", weightCarat=" + weightCarat +
            ", purchaseVerified=" + purchaseVerified +
            ", drawingNo='" + drawingNo + '\'' +
            ", currentStage='" + currentStage + '\'' +
            ", qualityPass=" + qualityPass +
            ", orderAmount=" + orderAmount +
            ", businessTime=" + businessTime +
            ", remark='" + remark + '\'' +
            '}';
}
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:02
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : ConsoleLogHandler.java
explain   : 学习  类
**/
package ObserverPattern.logging;
/**
控制台日志输出处理器
/
public class ConsoleLogHandler {
/*
将日志输出至System控制台
@param msg 日志消息对象
*/
public void write(LogMessage msg) {
StringBuilder sb = new StringBuilder();
sb.append(msg.time).append(" [").append(msg.level).append("] ")
.append("[").append(msg.categoryName).append("] ")
.append(msg.message);
if(msg.exception != null) {
sb.append(System.lineSeparator());
sb.append(getExceptionStack(msg.exception));
}
System.out.println(sb);
}
/**
获取异常堆栈字符串
*/
private String getExceptionStack(Throwable ex) {
StringBuilder stack = new StringBuilder();
stack.append(ex.getMessage()).append(System.lineSeparator());
for(StackTraceElement ele : ex.getStackTrace()){
stack.append("\t").append(ele.toString()).append(System.lineSeparator());
}
return stack.toString();
}
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:02
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : FileLogHandler.java
explain   : 学习  类
**/
package ObserverPattern.logging;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.locks.ReentrantLock;
/**
文件日志处理器:对标Karambolo.Extensions.Logging.File
目录结构 Logs/yyyy‑MM‑dd/app‑{level}.log
多线程并发写入:ReentrantLock保证线程安全
/
public class FileLogHandler {
/*
文件写入锁,保证高并发线程安全
/
private final ReentrantLock writeLock;
/*
日志根目录
/
private final String rootLogDir;
/*
日期格式化 yyyy‑MM‑dd
*/
private final DateTimeFormatter dateFormatter;
public FileLogHandler(String rootLogDir) {
this.rootLogDir = rootLogDir;
this.writeLock = new ReentrantLock();
this.dateFormatter = DateTimeFormatter.ofPattern("yyyy‑MM‑dd");
}
/**
写日志文件
@param msg 日志消息
*/
public void write(LogMessage msg) {
writeLock.lock();
try {
// 构建日期文件夹路径 Logs/2026‑09‑08
String dateFolderName = LocalDate.now().format(dateFormatter);
File dateDir = new File(rootLogDir, dateFolderName);
if (!dateDir.exists()) {
dateDir.mkdirs();
}
// 文件名称 app‑debug.log / app‑info.log / app‑warn.log / app‑error.log
String fileName = switch (msg.level) {
case Debug -> "app‑debug.log";
case Info -> "app‑info.log";
case Warn -> "app‑warn.log";
case Error -> "app‑error.log";
};
File targetFile = new File(dateDir, fileName);
 StringBuilder sb = new StringBuilder();
 sb.append(msg.time).append(" [").append(msg.level).append("] ")
         .append("[").append(msg.categoryName).append("] ")
         .append(msg.message);
 if(msg.exception != null) {
     sb.append(System.lineSeparator());
     sb.append(getExceptionStack(msg.exception));
 }
 sb.append(System.lineSeparator());

 try(FileWriter fw = new FileWriter(targetFile, true)) {
     fw.write(sb.toString());
     fw.flush();
 }
} catch (IOException e) {
// 文件日志写入失败,输出控制台兜底
System.err.println("文件日志写入异常:" + e.getMessage());
} finally {
writeLock.unlock();
}
}
/**
获取异常堆栈字符串
*/
private String getExceptionStack(Throwable ex) {
StringBuilder stack = new StringBuilder();
stack.append(ex.getMessage()).append(System.lineSeparator());
for(StackTraceElement ele : ex.getStackTrace()){
stack.append("\t").append(ele.toString()).append(System.lineSeparator());
}
return stack.toString();
}
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:02
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : ILogger.java
explain   : 学习  类
**/
package ObserverPattern.logging;
/**
泛型日志接口,对标 .NET ILogger<T>
@param <T> 业务类型,用作日志分类
/
public interface ILogger<T> {
/*
调试日志
@param format 格式化字符串
@param args 参数
*/
void debug(String format, Object... args);
/**
信息日志
@param format 格式化字符串
@param args 参数
*/
void info(String format, Object... args);
/**
警告日志
@param format 格式化字符串
@param args 参数
*/
void warn(String format, Object... args);
/**
错误日志
@param format 格式化字符串
@param args 参数
*/
void error(String format, Object... args);
/**
错误日志附带异常
@param ex 异常对象
@param format 格式化字符串
@param args 参数
*/
void error(Throwable ex, String format, Object... args);
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:02
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : ILoggerFactory.java
explain   : 学习  类
**/
package ObserverPattern.logging;
/**
日志工厂接口,创建ILogger实例
/
public interface ILoggerFactory {
/*
根据Class创建日志实例
@param clazz 业务类
@return ILogger
*/
<T> ILogger<T> createLogger(Class<T> clazz);
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:03
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : LoggerFactoryImpl.java
explain   : 学习  类
**/
package ObserverPattern.logging;
import java.time.LocalDateTime;
/**
ILoggerFactory 实现,创建ILogger<T>实例
*/
public class LoggerFactoryImpl implements ILoggerFactory {
private final ConsoleLogHandler consoleHandler;
private final FileLogHandler fileHandler;
public LoggerFactoryImpl(ConsoleLogHandler consoleHandler, FileLogHandler fileHandler) {
this.consoleHandler = consoleHandler;
this.fileHandler = fileHandler;
}
@Override
@SuppressWarnings("unchecked")
public <T> ILogger<T> createLogger(Class<T> clazz) {
return new ILogger<>() {
private final String category = clazz.getName();
     @Override
     public void debug(String format, Object... args) {
         log(LogLevel.Debug, null, format, args);
     }

     @Override
     public void info(String format, Object... args) {
         log(LogLevel.Info, null, format, args);
     }

     @Override
     public void warn(String format, Object... args) {
         log(LogLevel.Warn, null, format, args);
     }

     @Override
     public void error(String format, Object... args) {
         log(LogLevel.Error, null, format, args);
     }

     @Override
     public void error(Throwable ex, String format, Object... args) {
         log(LogLevel.Error, ex, format, args);
     }

     private void log(LogLevel level, Throwable ex, String format, Object[] args) {
         LogMessage lm = new LogMessage();
         lm.time = LocalDateTime.now();
         lm.level = level;
         lm.categoryName = category;
         lm.message = String.format(format, args);
         lm.exception = ex;
         consoleHandler.write(lm);
         fileHandler.write(lm);
     }
 };
}
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:02
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : LogLevel.java
explain   : 学习  类
**/
package ObserverPattern.logging;
/**
日志等级定义,与 .NET Microsoft.Extensions.Logging对齐
/
public enum LogLevel {
/*
调试日志
/
Debug,
/*
信息日志
/
Info,
/*
警告日志
/
Warn,
/*
错误日志
*/
Error
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:03
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : LogMessage.java
explain   : 学习  类
**/
package ObserverPattern.logging;
import java.time.LocalDateTime;
/**
日志消息实体
/
public class LogMessage {
/*
日志发生时间
/
public LocalDateTime time;
/*
日志等级
/
public LogLevel level;
/*
日志分类名称(类名)
/
public String categoryName;
/*
格式化之后消息文本
/
public String message;
/*
异常堆栈信息
*/
public Throwable exception;
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:01
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : CircuitBreakerExceptio.java
explain   : 学习  类
**/
package ObserverPattern.circuit;
/**
熔断器触发抛出异常
*/
public class CircuitBreakerException extends RuntimeException {
public CircuitBreakerException(String msg) {
super(msg);
}
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:00
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : CircuitBreakerState.java
explain   : 学习  类
**/
package ObserverPattern.circuit;
/**
熔断器状态:关闭|打开|半开
/
public enum CircuitBreakerState {
/*
关闭:正常调用
/
Closed,
/*
打开:熔断,直接拒绝调用
/
Open,
/*
半开:允许少量试探请求
*/
HalfOpen
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:01
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : RetryCircuitAdapter.java
explain   : 学习  类
**/
package ObserverPattern.circuit;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import java.util.concurrent.atomic.AtomicInteger;
/**
重试熔断适配器,适配器模式实现
线程安全:AtomicInteger计数
/
public class RetryCircuitAdapter {
private final ILogger<RetryCircuitAdapter> logger;
/*
当前熔断器状态
/
private CircuitBreakerState state;
/*
失败计数器,原子类型保证并发安全
/
private final AtomicInteger failCounter;
/*
最大允许失败阈值
/
private final int failThreshold;
/*
最大重试次数
*/
private final int maxRetryTimes;
public RetryCircuitAdapter(ILoggerFactory factory, int failThreshold, int maxRetryTimes) {
this.logger = factory.createLogger(RetryCircuitAdapter.class);
this.state = CircuitBreakerState.Closed;
this.failCounter = new AtomicInteger(0);
this.failThreshold = failThreshold;
this.maxRetryTimes = maxRetryTimes;
}
/**
执行带重试+熔断保护的业务调用
@param action 需要执行的业务逻辑
@return 业务返回结果
@throws Exception 业务异常 / 熔断异常
*/
public <T> T execute(Supplier<T> action) throws Exception {
// 判断熔断打开状态
if (state == CircuitBreakerState.Open) {
logger.warn("熔断器已打开,拒绝执行业务调用");
throw new CircuitBreakerException("熔断器打开,请求被拦截");
}
int retryCount = 0;
while (true) {
try {
T result = action.get();
// 调用成功,重置失败计数器
failCounter.set(0);
if (state == CircuitBreakerState.HalfOpen) {
state = CircuitBreakerState.Closed;
logger.info("半开状态试探调用成功,熔断器切换关闭");
}
return result;
} catch (Exception ex) {
int currentFail = failCounter.incrementAndGet();
logger.error(ex, "业务调用失败,重试次数:{0},累计失败:{1}", retryCount, currentFail);
// 判断是否触发熔断阈值
if (currentFail >= failThreshold) {
state = CircuitBreakerState.Open;
logger.error("达到失败阈值,熔断器切换Open状态");
throw new CircuitBreakerException("触发熔断阈值"+ ex.getMessage());
}
retryCount++;
if (retryCount >= maxRetryTimes) {
logger.error("已达到最大重试次数,终止调用");
throw ex;
}
Thread.sleep(200);
}
}
}
/**
手动切换熔断器半开状态,用于恢复探测
*/
public void switchHalfOpen() {
this.state = CircuitBreakerState.HalfOpen;
logger.info("手动切换熔断器至半开状态");
}
/**
函数式接口,模拟JDK Supplier,兼容异常抛出
*/
@FunctionalInterface
public interface Supplier<T> {
T get() throws Exception;
}
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:04
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : DiContainer.java
explain   : 学习  类
**/
package ObserverPattern.di;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.lang.reflect.Constructor;
/**
简易DI容器,非Spring实现
线程安全 ConcurrentHashMap存储服务元数据
*/
public class DiContainer {
private final List<ServiceDescriptor> serviceDescriptors;
private final Map<Class<?>, Object> singletonCache;
public DiContainer() {
serviceDescriptors = new ArrayList<>();
singletonCache = new ConcurrentHashMap<>();
}
/**
注册单例服务
@param serviceType 接口
@param implType 实现类
*/
public void addSingleton(Class<?> serviceType, Class<?> implType) {
ServiceDescriptor sd = new ServiceDescriptor();
sd.serviceType = serviceType;
sd.implType = implType;
sd.lifetime = ServiceLifetime.Singleton;
serviceDescriptors.add(sd);
}
/**
注册瞬时服务
@param serviceType 接口
@param implType 实现类
*/
public void addTransient(Class<?> serviceType, Class<?> implType) {
ServiceDescriptor sd = new ServiceDescriptor();
sd.serviceType = serviceType;
sd.implType = implType;
sd.lifetime = ServiceLifetime.Transient;
serviceDescriptors.add(sd);
}
/**
直接注册已经实例化好的单例对象
@param serviceType 服务类型
@param instance 对象实例
*/
public void addSingletonInstance(Class<?> serviceType, Object instance) {
ServiceDescriptor sd = new ServiceDescriptor();
sd.serviceType = serviceType;
sd.implType = instance.getClass();
sd.lifetime = ServiceLifetime.Singleton;
sd.singletonInstance = instance;
serviceDescriptors.add(sd);
singletonCache.put(serviceType, instance);
}
/**
获取服务实例,递归解析构造函数依赖
@param clazz 需要获取的服务类型
@return 对象实例
*/
@SuppressWarnings("unchecked")
public <T> T getService(Class<T> clazz) {
for (ServiceDescriptor sd : serviceDescriptors) {
if (!sd.serviceType.isAssignableFrom(clazz) && !sd.serviceType.equals(clazz)) {
continue;
}
// 单例
if(sd.lifetime == ServiceLifetime.Singleton) {
if(singletonCache.containsKey(sd.serviceType)) {
return (T) singletonCache.get(sd.serviceType);
}
Object instance = createInstance(sd.implType);
singletonCache.put(sd.serviceType, instance);
return (T) instance;
} else {
// Transient
return (T) createInstance(sd.implType);
}
}
throw new RuntimeException("DI容器找不到服务:" + clazz.getName());
}
/**
通过反射构造函数创建实例,自动解析依赖参数
*/
private Object createInstance(Class<?> implClazz) {
Constructor<?>[] constructors = implClazz.getConstructors();
Constructor<?> targetCtor = constructors[0];
Class<?>[] paramTypes = targetCtor.getParameterTypes();
Object[] paramInstances = new Object[paramTypes.length];
for(int i=0;i<paramTypes.length;i++){
paramInstances[i] = getService(paramTypes[i]);
}
try {
return targetCtor.newInstance(paramInstances);
} catch (Exception e) {
throw new RuntimeException("实例化失败 class:" + implClazz.getName(), e);
}
}
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:03
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : ServiceDescriptor.java
explain   : 学习  类
**/
package ObserverPattern.di;
/**
服务注册描述信息
/
public class ServiceDescriptor {
/*
服务接口Class
/
public Class<?> serviceType;
/*
实现类Class
/
public Class<?> implType;
/*
生命周期
/
public ServiceLifetime lifetime;
/*
单例实例缓存
*/
public Object singletonInstance;
}
/**
encoding: utf-8
版权所有 2026 ©涂聚文有限公司 ®
许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
Author    : geovindu,Geovin Du 涂聚文.
IDE       : IntelliJ IDEA 2024.3.6 Java 21
database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
OS        : window10
Datetime  : 2026 - 2026/9/8 - 22:03
User      : geovindu
Product   : IntelliJ IDEA
Project   : javadesginpattern
File      : ServiceLifetime.java
explain   : 学习  类
**/
package ObserverPattern.di;
/**
服务生命周期:单例 / 瞬时
/
public enum ServiceLifetime {
/*
单例,全局唯一实例
/
Singleton,
/*
瞬时,每次获取新建对象
*/
Transient
}
java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:56
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : PurchaseVerifyObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer;
 
import ObserverPattern.dto.JewelryProcessDto;
 
/**
 * 珠宝业务流程观察者接口
 * 所有业务部门:采购、设计、生产、质检、财务等实现此接口
 */
public interface IProcessObserver {
    /**
     * 接收主题推送业务变更通知
     * @param dto 珠宝流程业务数据
     */
    void update(JewelryProcessDto dto);
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:56
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ProcessSubject.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer;
 
import ObserverPattern.dto.JewelryProcessDto;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 珠宝业务流程主题 Subject
 * 维护观察者集合,业务状态变更时通知全部订阅部门
 */
public class ProcessSubject {
    /**
     * 订阅观察者集合
     */
    private final List<IProcessObserver> observerList;
 
    public ProcessSubject() {
        observerList = new ArrayList<>();
    }
 
    /**
     * 注册观察者(订阅业务事件)
     * @param observer 业务部门观察者
     */
    public void attach(IProcessObserver observer) {
        if (!observerList.contains(observer)) {
            observerList.add(observer);
        }
    }
 
    /**
     * 移除观察者(取消订阅)
     * @param observer 业务部门观察者
     */
    public void detach(IProcessObserver observer) {
        observerList.remove(observer);
    }
 
    /**
     * 通知全部已订阅观察者
     * @param dto 珠宝流程业务数据
     */
    public void notifyAllObservers(JewelryProcessDto dto) {
        for (IProcessObserver obs : observerList) {
            obs.update(dto);
        }
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:59
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BusinessDeptObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 业务部门观察者
 */
public class BusinessDeptObserver implements IProcessObserver {
    private final ILogger<BusinessDeptObserver> logger;
 
    public BusinessDeptObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(BusinessDeptObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【业务部】跟进客户订单流程:%s", dto.getProcessNo());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : DesignDrawObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
/**
 * 设计制图部门观察者
 */
public class DesignDrawObserver implements IProcessObserver {
    private final ILogger<DesignDrawObserver> logger;
 
    public DesignDrawObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(DesignDrawObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【设计制图】接收流程:%s,图纸编号:%s", dto.getProcessNo(), dto.getDrawingNo());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : FinanceObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 财务部门观察者
 */
public class FinanceObserver implements IProcessObserver {
    private final ILogger<FinanceObserver> logger;
 
    public FinanceObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(FinanceObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【财务部】流程%s 订单金额:%s", dto.getProcessNo(), dto.getOrderAmount());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:59
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : HrAdminObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 人事行政观察者
 */
public class HrAdminObserver implements IProcessObserver {
    private final ILogger<HrAdminObserver> logger;
 
    public HrAdminObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(HrAdminObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【人事行政】记录生产业务事件:%s", dto.getProcessNo());
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 22:00
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ItDeptObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * IT运维部门观察者
 */
public class ItDeptObserver implements IProcessObserver {
    private final ILogger<ItDeptObserver> logger;
 
    public ItDeptObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(ItDeptObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【IT部门】业务事件落库,流程编号:%s", dto.getProcessNo());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LogisticsObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 物流仓储观察者
 */
public class LogisticsObserver implements IProcessObserver {
    private final ILogger<LogisticsObserver> logger;
 
    public LogisticsObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(LogisticsObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【物流部门】流程%s准备出库发货", dto.getProcessNo());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ManufactureObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 加工生产车间观察者
 */
public class ManufactureObserver implements IProcessObserver {
    private final ILogger<ManufactureObserver> logger;
 
    public ManufactureObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(ManufactureObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【加工生产车间】开始加工 流程号:%s", dto.getProcessNo());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MarketingObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 营销推广部门观察者
 */
public class MarketingObserver implements IProcessObserver {
    private final ILogger<MarketingObserver> logger;
 
    public MarketingObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(MarketingObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【营销推广】新品流程%s,准备营销素材", dto.getProcessNo());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : PackObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 成品包装部门观察者
 */
public class PackObserver implements IProcessObserver {
    private final ILogger<PackObserver> logger;
 
    public PackObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(PackObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【包装组】对流程%s成品进行包装作业", dto.getProcessNo());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : PurchaseVerifyObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 原料采购核验观察者
 */
public class PurchaseVerifyObserver implements IProcessObserver {
    private final ILogger<PurchaseVerifyObserver> logger;
 
    public PurchaseVerifyObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(PurchaseVerifyObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【原料采购核验】收到业务事件,流程号:%s", dto.getProcessNo());
        if (dto.isPurchaseVerified()) {
            logger.debug("原料%s核验通过,重量:%sct", dto.getMaterialName(), dto.getWeightCarat());
        } else {
            logger.warn("原料%s核验不通过,请复检", dto.getMaterialName());
        }
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 21:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : QualityCheckObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 质量检测部门观察者
 */
public class QualityCheckObserver implements IProcessObserver {
    private final ILogger<QualityCheckObserver> logger;
 
    public QualityCheckObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(QualityCheckObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【质检部门】流程:%s,质检结果:%s", dto.getProcessNo(), dto.isQualityPass()?"合格":"不合格");
        if (!dto.isQualityPass()) {
            logger.error("流程%s质检失败,需要返工", dto.getProcessNo());
        }
    }
}
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 22:00
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : TrainingObserver.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.observer.observers;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.IProcessObserver;
 
/**
 * 培训部门观察者
 */
public class TrainingObserver implements IProcessObserver {
    private final ILogger<TrainingObserver> logger;
 
    public TrainingObserver(ILoggerFactory factory) {
        this.logger = factory.createLogger(TrainingObserver.class);
    }
 
    @Override
    public void update(JewelryProcessDto dto) {
        logger.info("【培训部】采集业务案例用于员工培训:%s", dto.getProcessNo());
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/8 - 22:04
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelryProcessScheduler.java
 * explain   : 学习  类
 **/
 
package ObserverPattern.scheduler;
 
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ILogger;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.observer.ProcessSubject;
 
/**
 * 珠宝业务流程调度器
 * 驱动整个业务流转,触发观察者通知
 */
public class JewelryProcessScheduler {
    private final ILogger<JewelryProcessScheduler> logger;
    private final ProcessSubject processSubject;
 
    public JewelryProcessScheduler(ILoggerFactory factory, ProcessSubject subject) {
        this.logger = factory.createLogger(JewelryProcessScheduler.class);
        this.processSubject = subject;
    }
 
    /**
     * 执行业务流程调度
     * @param dto 珠宝业务DTO
     */
    public void runProcess(JewelryProcessDto dto) {
        logger.info("===== 珠宝业务调度器启动,流程编号:{0} =====", dto.getProcessNo());
        // 触发全部订阅观察者通知
        processSubject.notifyAllObservers(dto);
        logger.info("===== 珠宝业务调度器执行结束 =====");
    }
}

调用:

java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:观察者模式 Observer Pattern 行为模式 Behavioral Patterns
 * 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:06
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ObserverBll.java
 * explain   : 学习  类
 **/
package BLL;
import ObserverPattern.di.DiContainer;
import ObserverPattern.dto.JewelryProcessDto;
import ObserverPattern.logging.ConsoleLogHandler;
import ObserverPattern.logging.FileLogHandler;
import ObserverPattern.logging.ILoggerFactory;
import ObserverPattern.logging.LoggerFactoryImpl;
import ObserverPattern.observer.ProcessSubject;
import ObserverPattern.observer.observers.*;
import ObserverPattern.scheduler.JewelryProcessScheduler;
import java.math.BigDecimal;
import java.time.LocalDateTime;
public class ObserverBll {
public void demo(){
    //1.初始化日志组件
    ConsoleLogHandler consoleLogHandler = new ConsoleLogHandler();
    FileLogHandler fileLogHandler = new FileLogHandler("Logs");
    ILoggerFactory loggerFactory = new LoggerFactoryImpl(consoleLogHandler, fileLogHandler);

    //2.初始化DI容器,非Spring
    DiContainer diContainer = new DiContainer();
    diContainer.addSingletonInstance(ILoggerFactory.class, loggerFactory);

    //3.实例化主题对象
    ProcessSubject subject = new ProcessSubject();
    // 注册全部业务观察者
    subject.attach(new PurchaseVerifyObserver(loggerFactory));
    subject.attach(new DesignDrawObserver(loggerFactory));
    subject.attach(new ManufactureObserver(loggerFactory));
    subject.attach(new QualityCheckObserver(loggerFactory));
    subject.attach(new PackObserver(loggerFactory));
    subject.attach(new LogisticsObserver(loggerFactory));
    subject.attach(new FinanceObserver(loggerFactory));
    subject.attach(new MarketingObserver(loggerFactory));
    subject.attach(new BusinessDeptObserver(loggerFactory));
    subject.attach(new HrAdminObserver(loggerFactory));
    subject.attach(new ItDeptObserver(loggerFactory));
    subject.attach(new TrainingObserver(loggerFactory));

    //4.注册调度器
    JewelryProcessScheduler scheduler = new JewelryProcessScheduler(loggerFactory, subject);

    //5.构造测试业务DTO
    JewelryProcessDto dto = new JewelryProcessDto();
    dto.setProcessNo("JW‑20260908‑0001");
    dto.setMaterialCode("MAT‑D‑00128");
    dto.setMaterialName("天然钻石");
    dto.setWeightCarat(1.28);
    dto.setPurchaseVerified(true);
    dto.setDrawingNo("DR‑2026‑1142");
    dto.setCurrentStage("质检完成待包装");
    dto.setQualityPass(true);
    dto.setOrderAmount(new BigDecimal("26800.00"));
    dto.setBusinessTime(LocalDateTime.now());
    dto.setRemark("定制钻戒订单");

    //6.执行调度流程
    scheduler.runProcess(dto);
}
}

输出:

相关推荐
Am-Chestnuts1 小时前
通义千问任务清单怎么导出Word?用DS随心转保留层级和勾选项
开发语言·c#·word
lemon_sjdk1 小时前
ObservableNumberValue接口
java·javafx
山甫aa1 小时前
【从零开始的 Web 后端学习】令牌技术一篇搞定(JWT 登录认证保姆级)
后端·学习·spring·web·jwt
wxwx_bscxy3221 小时前
springboot巡更系统10192
java·spring boot·后端·巡更系统
liliangcsdn1 小时前
基于信号强度的稀疏选股算法的探索分析
开发语言·python
竞赛考级题库1 小时前
202606 青少年等级考试C/C++真题一级 建议答题时长:60min
java·c语言·c++
大树911 小时前
把 Java 项目从手动 SCP 升级到 Gitee Go 自动部署:一份踩坑实录
java·golang·gitee
4SAPI1 小时前
2026年大模型API接入选型指南:企业与个人用户的架构、稳定性与成本考量
大数据·开发语言·数据库·人工智能·架构·php
lmy_loveF1 小时前
go 切换go version 版本
开发语言·后端·golang