java:Observer Pattern
项目结构:

/**
* 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 : JewelryProcessDto.java
* explain : 学习 类
**/
package ObserverPattern.dto;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.*;
import java.math.*;
/**
* 珠宝全流程业务DTO 领域实体
* 承载原料采购、设计、生产、质检全链路业务数据
*/
public class JewelryProcessDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 业务流程唯一编号
*/
private String processNo;
/**
* 原料物料编码
*/
private String materialCode;
/**
* 原料名称:钻石/红宝石/翡翠等
*/
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
}
/**
* 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("===== 珠宝业务调度器执行结束 =====");
}
}
调用:
/**
* 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);
}
}
输出:

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号