java: Memento Pattern

项目结构:

java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:11
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ConcurrentSafeHelper.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Common;
 
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Consumer;
import java.util.function.Supplier;
 
/**
 * 线程安全通用工具类
 * 封装读写分离锁、安全读写方法,全局复用,统一并发管控规范
 */
public final class ConcurrentSafeHelper {
    /**
     * 创建无递归读写分离锁,读多写少高性能场景推荐
     * @return 读写锁实例
     */
    public static ReentrantReadWriteLock createReadWriteLock() {
        return new ReentrantReadWriteLock(false);
    }
 
    /**
     * 线程安全执行写入操作
     * @param rwLock 读写锁对象
     * @param writeAction 待执行写入逻辑
     */
    public static void safeWrite(ReentrantReadWriteLock rwLock, Runnable writeAction) {
        if (rwLock == null || writeAction == null) {
            return;
        }
        ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
        writeLock.lock();
        try {
            writeAction.run();
        } finally {
            writeLock.unlock();
        }
    }
 
    /**
     * 线程安全执行无返回值读取操作
     * @param rwLock 读写锁对象
     * @param readAction 读取逻辑
     */
    public static void safeRead(ReentrantReadWriteLock rwLock, Runnable readAction) {
        if (rwLock == null || readAction == null) {
            return;
        }
        ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
        readLock.lock();
        try {
            readAction.run();
        } finally {
            readLock.unlock();
        }
    }
 
    /**
     * 线程安全读取带返回值泛型方法
     * @param rwLock 读写锁
     * @param readFunc 读取委托
     * @return 读取结果
     */
    public static <T> T safeRead(ReentrantReadWriteLock rwLock, Supplier<T> readFunc) {
        if (rwLock == null || readFunc == null) {
            return null;
        }
        ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
        readLock.lock();
        try {
            return readFunc.get();
        } finally {
            readLock.unlock();
        }
    }
 
    //私有构造禁止实例化
    private ConcurrentSafeHelper() {
        throw new AssertionError("工具类不可实例化");
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:10
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : GlobalConfig.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Common;
 
/**
 * 全局静态统一配置类
 * 集中管理日志路径、格式化模板、系统常量,统一修改便于扩展维护
 */
public final class GlobalConfig {
    /**
     * 日志根文件夹名称
     */
    public static final String LOG_ROOT_DIRECTORY = "Logs";
    /**
     * 日期文件夹格式化模板,生成如 2026-08-05
     */
    public static final String LOG_DAY_FOLDER_FORMAT = "%d{yyyy-MM-dd}";
    /**
     * 日志文件名模板:app-{级别}.log
     */
    public static final String LOG_FILE_NAME_TEMPLATE = "app-%s.log";
    /**
     * 日志时间戳格式化模板,精确到毫秒
     */
    public static final String LOG_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
    /**
     * 珠宝业务编号前缀
     */
    public static final String BUSINESS_SN_PREFIX = "JEW-ENTER-";
    /**
     * 全局最低日志级别
     */
    public static final org.slf4j.event.Level GLOBAL_MIN_LOG_LEVEL = org.slf4j.event.Level.DEBUG;
 
    //私有构造禁止实例化
    private GlobalConfig() {
        throw new AssertionError("静态配置类不可实例化");
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:12
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BaseMemento.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Core.Base;
 
import java.time.LocalDateTime;
 
/**
 * 备忘录模式顶层抽象快照基类
 * 定义所有快照通用基础属性,后续任意业务快照可继承扩展
 */
public abstract class BaseMemento {
    /**
     * 快照创建时间
     */
    private final LocalDateTime createTime;
    /**
     * 业务唯一编号
     */
    private final String businessSn;
 
    /**
     * 基础快照构造初始化
     * @param businessSn 业务唯一编号
     */
    protected BaseMemento(String businessSn) {
        this.businessSn = businessSn;
        this.createTime = LocalDateTime.now();
    }
 
    public LocalDateTime getCreateTime() {
        return createTime;
    }
 
    public String getBusinessSn() {
        return businessSn;
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:11
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BaseService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Core.Base;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * 所有业务服务、调度器、模式类统一父基类
 * 子类自动绑定对应Logger,全局统一日志依赖,规范编码结构
 * @param <T> 当前子类自身类型
 */
public abstract class BaseService<T> {
    /**
     * 当前类专属日志实例,子类直接使用输出日志
     */
    protected final Logger logger;
 
    /**
     * 构造自动初始化当前类Logger
     */
    @SuppressWarnings("unchecked")
    protected BaseService() {
        Class<T> clazz = (Class<T>) getClass();
        this.logger = LoggerFactory.getLogger(clazz);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:14
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LoggerBuildFactory.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Core.Logging;
 
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.util.FileSize;
import MementoPattern.Common.GlobalConfig;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
 
/**
 * 日志构建工厂类
 * 统一初始化控制台+分级文件日志,实现按日期文件夹、日志等级拆分文件、多线程安全写入
 */
public class LoggerBuildFactory {
    /**
     * 全局日志统一初始化方法
     */
    public static void buildGlobalLogger() {
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        context.reset();
 
        //1、构建编码器(控制台+文件共用一套格式)
        PatternLayoutEncoder encoder = buildEncoder(context);
 
        //2、注册控制台输出
        ConsoleAppender<ILoggingEvent> consoleAppender = buildConsoleAppender(context, encoder);
 
        //3、注册4个分级文件日志(debug/info/warn/error)
        buildLevelFileAppender(context, encoder, Level.DEBUG, "debug");
        buildLevelFileAppender(context, encoder, Level.INFO, "info");
        buildLevelFileAppender(context, encoder, Level.WARN, "warn");
        buildLevelFileAppender(context, encoder, Level.ERROR, "error");
 
        //4、全局根日志配置
        ch.qos.logback.classic.Logger rootLogger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
        rootLogger.setLevel(Level.DEBUG);
        rootLogger.addAppender(consoleAppender);
 
        //过滤框架冗余日志
        context.getLogger("org.springframework").setLevel(Level.WARN);
    }
 
    /**
     * 构建统一格式编码器
     */
    private static PatternLayoutEncoder buildEncoder(LoggerContext context) {
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(context);
        encoder.setPattern(LogUniformFormatter.LOG_PATTERN);
        encoder.start();
        return encoder;
    }
 
    /**
     * 构建控制台追加器
     */
    private static ConsoleAppender<ILoggingEvent> buildConsoleAppender(LoggerContext context, PatternLayoutEncoder encoder) {
        ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<>();
        consoleAppender.setContext(context);
        consoleAppender.setEncoder(encoder);
        consoleAppender.start();
        return consoleAppender;
    }
 
    /**
     * 构建单等级文件日志追加器,按日期文件夹归档
     */
    private static void buildLevelFileAppender(LoggerContext context, PatternLayoutEncoder encoder, Level level, String levelName) {
        RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<>();
        fileAppender.setContext(context);
 
        // 当前日志文件路径(使用实际日期)
        String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        String currentFilePath = GlobalConfig.LOG_ROOT_DIRECTORY + File.separator
                + today + File.separator
                + String.format(GlobalConfig.LOG_FILE_NAME_TEMPLATE, levelName);
 
        // 滚动归档文件路径模式(使用Logback日期占位符)
        String archivePattern = GlobalConfig.LOG_ROOT_DIRECTORY + File.separator
                + "%d{yyyy-MM-dd}" + File.separator
                + String.format(GlobalConfig.LOG_FILE_NAME_TEMPLATE, levelName);
 
        fileAppender.setFile(currentFilePath);
        fileAppender.setEncoder(encoder);
 
        //按日期滚动策略
        TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
        rollingPolicy.setContext(context);
        rollingPolicy.setFileNamePattern(archivePattern);
        rollingPolicy.setMaxHistory(90);
        rollingPolicy.setTotalSizeCap(FileSize.valueOf("5GB"));
        // 必须先setRollingPolicy(内部会设置parent),再由fileAppender.start()启动policy
        fileAppender.setRollingPolicy(rollingPolicy);
        // 不要单独调用 rollingPolicy.start(),fileAppender.start() 会自动启动它
 
        //级别过滤器
        ch.qos.logback.classic.filter.LevelFilter levelFilter = new ch.qos.logback.classic.filter.LevelFilter();
        levelFilter.setLevel(level);
        levelFilter.setOnMatch(ch.qos.logback.core.spi.FilterReply.ACCEPT);
        levelFilter.setOnMismatch(ch.qos.logback.core.spi.FilterReply.DENY);
        levelFilter.start();
        fileAppender.addFilter(levelFilter);
 
        fileAppender.start();
 
        //挂载到根日志
        ch.qos.logback.classic.Logger root = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
        root.addAppender(fileAppender);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:12
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LogUniformFormatter.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Core.Logging;
 
import MementoPattern.Common.GlobalConfig;
 
/**
 * 统一日志格式化提供器
 * 严格保证控制台日志、文件日志格式100%完全一致
 */
public final class LogUniformFormatter {
    /**
     * 获取统一日志格式字符串模板
     */
    public static final String LOG_PATTERN =
            "%d{" + GlobalConfig.LOG_TIME_FORMAT + "} [%thread] %-5level %logger{36} - %msg%n";
 
    private LogUniformFormatter() {
        throw new AssertionError("静态工具类不可实例化");
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/6 - 22:22
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BusinessOriginator.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Pattern.Memento;
 
import MementoPattern.Core.Base.BaseService;
 
import java.math.BigDecimal;
 
/**
 * 备忘录原发器:持有全业务运行状态
 * 负责生成快照、快照回滚恢复业务历史状态
 */
public class BusinessOriginator extends BaseService<BusinessOriginator> {
    //当前业务运行状态字段
    private String currentBusinessSn = "";
    private String currentMaterial = "";
    private BigDecimal currentWeight = BigDecimal.ZERO;
    private String currentDesign = "";
    private String currentCraft = "";
    private BigDecimal currentScore = BigDecimal.ZERO;
    private BigDecimal currentAmount = BigDecimal.ZERO;
 
    //Getter & Setter
    public String getCurrentBusinessSn() {
        return currentBusinessSn;
    }
 
    public void setCurrentBusinessSn(String currentBusinessSn) {
        this.currentBusinessSn = currentBusinessSn;
    }
 
    public String getCurrentMaterial() {
        return currentMaterial;
    }
 
    public void setCurrentMaterial(String currentMaterial) {
        this.currentMaterial = currentMaterial;
    }
 
    public BigDecimal getCurrentWeight() {
        return currentWeight;
    }
 
    public void setCurrentWeight(BigDecimal currentWeight) {
        this.currentWeight = currentWeight;
    }
 
    public String getCurrentDesign() {
        return currentDesign;
    }
 
    public void setCurrentDesign(String currentDesign) {
        this.currentDesign = currentDesign;
    }
 
    public String getCurrentCraft() {
        return currentCraft;
    }
 
    public void setCurrentCraft(String currentCraft) {
        this.currentCraft = currentCraft;
    }
 
    public BigDecimal getCurrentScore() {
        return currentScore;
    }
 
    public void setCurrentScore(BigDecimal currentScore) {
        this.currentScore = currentScore;
    }
 
    public BigDecimal getCurrentAmount() {
        return currentAmount;
    }
 
    public void setCurrentAmount(BigDecimal currentAmount) {
        this.currentAmount = currentAmount;
    }
 
    /**
     * 根据当前实时业务状态生成快照
     * @return 业务快照对象
     */
    public JewelryBusinessMemento createMemento() {
        logger.debug("【快照生成】业务编号:{},记录当前全流程业务状态", currentBusinessSn);
        return new JewelryBusinessMemento(currentBusinessSn, currentMaterial, currentWeight,
                currentDesign, currentCraft, currentScore, currentAmount);
    }
 
    /**
     * 使用历史快照回滚业务状态
     * @param memento 待恢复快照
     */
    public void restoreMemento(JewelryBusinessMemento memento) {
        if (memento == null) {
            logger.warn("快照为空,无法执行回滚操作");
            return;
        }
        this.currentBusinessSn = memento.getBusinessSn();
        this.currentMaterial = memento.getMaterialName();
        this.currentWeight = memento.getMaterialWeight();
        this.currentDesign = memento.getDesignContent();
        this.currentCraft = memento.getCraftType();
        this.currentScore = memento.getQualityScore();
        this.currentAmount = memento.getFinanceAmount();
        logger.info("【业务回滚成功】{}已恢复至{}历史快照", currentBusinessSn, memento.getCreateTime());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/6 - 22:21
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelryBusinessMemento.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Pattern.Memento;
 
import MementoPattern.Core.Base.BaseMemento;
import java.math.BigDecimal;
 
/**
 * 珠宝全业务快照实体
 * 存储原料、设计、加工、质检、财务等全流程业务状态,用于版本回滚、历史存档
 */
public class JewelryBusinessMemento extends BaseMemento {
    /**
     * 原料名称
     */
    private final String materialName;
    /**
     * 原料重量(g)
     */
    private final BigDecimal materialWeight;
    /**
     * 设计图纸文案内容
     */
    private final String designContent;
    /**
     * 加工工艺类型
     */
    private final String craftType;
    /**
     * 成品质检分数
     */
    private final BigDecimal qualityScore;
    /**
     * 本次业务财务金额
     */
    private final BigDecimal financeAmount;
 
    /**
     * 构造快照对象,记录全业务状态
     * @param businessSn 业务编号
     * @param materialName 原料名称
     * @param materialWeight 原料重量
     * @param designContent 图纸内容
     * @param craftType 加工工艺
     * @param qualityScore 质检分数
     * @param financeAmount 财务金额
     */
    public JewelryBusinessMemento(String businessSn, String materialName, BigDecimal materialWeight,
                                  String designContent, String craftType, BigDecimal qualityScore, BigDecimal financeAmount) {
        super(businessSn);
        this.materialName = materialName;
        this.materialWeight = materialWeight;
        this.designContent = designContent;
        this.craftType = craftType;
        this.qualityScore = qualityScore;
        this.financeAmount = financeAmount;
    }
 
    // Getter
    public String getMaterialName() {
        return materialName;
    }
 
    public BigDecimal getMaterialWeight() {
        return materialWeight;
    }
 
    public String getDesignContent() {
        return designContent;
    }
 
    public String getCraftType() {
        return craftType;
    }
 
    public BigDecimal getQualityScore() {
        return qualityScore;
    }
 
    public BigDecimal getFinanceAmount() {
        return financeAmount;
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/6 - 22:23
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MementoCaretaker.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Pattern.Memento;
 
import MementoPattern.Common.ConcurrentSafeHelper;
import MementoPattern.Core.Base.BaseService;
 
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
/**
 * 快照保管员:统一存储、查询、管理所有业务快照
 * 读写分离锁保证高并发线程安全
 */
public class MementoCaretaker extends BaseService<MementoCaretaker> {
    /**
     * 读写分离锁,管控快照集合并发读写
     */
    private final ReentrantReadWriteLock rwLock;
    /**
     * 内存快照仓库
     */
    private final List<JewelryBusinessMemento> mementoStore;
 
    public MementoCaretaker() {
        super();
        this.rwLock = ConcurrentSafeHelper.createReadWriteLock();
        this.mementoStore = new ArrayList<>();
    }
 
    /**
     * 新增快照入库(独占写锁)
     * @param memento 快照对象
     */
    public void addMemento(JewelryBusinessMemento memento) {
        if (memento == null) {
            logger.warn("待入库快照为空,入库失败");
            return;
        }
        ConcurrentSafeHelper.safeWrite(rwLock, () -> mementoStore.add(memento));
        logger.debug("快照仓库新增业务[{}]历史版本", memento.getBusinessSn());
    }
 
    /**
     * 根据业务编号查询全部历史快照,时间倒序
     * @param businessSn 业务编号
     * @return 快照集合
     */
    public List<JewelryBusinessMemento> getAllHistory(String businessSn) {
        return ConcurrentSafeHelper.safeRead(rwLock, () -> mementoStore.stream()
                .filter(item -> item.getBusinessSn().equals(businessSn))
                .sorted(Comparator.comparing(JewelryBusinessMemento::getCreateTime).reversed())
                .toList());
    }
 
    /**
     * 获取指定业务最新快照
     * @param businessSn 业务编号
     * @return 最新快照,无则null
     */
    public JewelryBusinessMemento getLatestMemento(String businessSn) {
        return ConcurrentSafeHelper.safeRead(rwLock, () -> mementoStore.stream()
                .filter(item -> item.getBusinessSn().equals(businessSn))
                .max(Comparator.comparing(JewelryBusinessMemento::getCreateTime))
                .orElse(null));
    }
 
    /**
     * 清空指定业务全部快照
     * @param businessSn 业务编号
     */
    public void clearBusinessHistory(String businessSn) {
        ConcurrentSafeHelper.safeWrite(rwLock, () -> mementoStore.removeIf(item -> item.getBusinessSn().equals(businessSn)));
        logger.info("已清空业务[{}]全部历史快照", businessSn);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/6 - 22:34
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IWorkflowSchedule.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Workflow;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 流水线调度顶层抽象接口
 * 新增流程仅需实现接口,完全满足开闭原则,高扩展
 */
public interface IWorkflowSchedule {
    /**
     * 异步执行全业务流水线
     */
    CompletableFuture<Void> runWholeWorkflowAsync();
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento 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/8/6 - 22:34
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelryWholeWorkflowScheduler.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Workflow;
 
import MementoPattern.Business.*;
import MementoPattern.Common.GlobalConfig;
import MementoPattern.Core.Base.BaseService;
import MementoPattern.Pattern.Memento.BusinessOriginator;
import MementoPattern.Pattern.Memento.MementoCaretaker;
 
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
 
/**
 * 珠宝全业务流水线调度器
 * 严格顺序串联12大业务流程:洽谈→采购→设计→加工→质检→包装→物流→财务→营销→人事→IT→培训
 */
public class JewelryWholeWorkflowScheduler extends BaseService<JewelryWholeWorkflowScheduler> implements IWorkflowSchedule {
    //全部业务服务
    private final BusinessNegotiateService negotiateService;
    private final MaterialPurchaseService purchaseService;
    private final DesignDrawService designService;
    private final ProduceProcessService produceService;
    private final QualityInspectService inspectService;
    private final PackageService packageService;
    private final LogisticsService logisticsService;
    private final FinanceAccountService financeService;
    private final MarketingPromoteService marketingService;
    private final HrAdminService hrService;
    private final ItOperationService itService;
    private final StaffTrainService trainService;
 
    private static final DateTimeFormatter SN_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
 
    public JewelryWholeWorkflowScheduler() {
        // 手动创建备忘录模式核心组件
        BusinessOriginator originator = new BusinessOriginator();
        MementoCaretaker caretaker = new MementoCaretaker();
 
        // 手动创建所有业务服务(替代Spring注入)
        this.negotiateService = new BusinessNegotiateService();
        this.purchaseService = new MaterialPurchaseService();
        this.designService = new DesignDrawService(originator, caretaker);
        this.produceService = new ProduceProcessService(originator, caretaker);
        this.inspectService = new QualityInspectService(originator, caretaker);
        this.packageService = new PackageService();
        this.logisticsService = new LogisticsService();
        this.financeService = new FinanceAccountService(originator, caretaker);
        this.marketingService = new MarketingPromoteService();
        this.hrService = new HrAdminService();
        this.itService = new ItOperationService();
        this.trainService = new StaffTrainService();
    }
 
    @Override
    public CompletableFuture<Void> runWholeWorkflowAsync() {
        return CompletableFuture.runAsync(() -> {
            String sn = GlobalConfig.BUSINESS_SN_PREFIX + LocalDateTime.now().format(SN_FORMAT);
            logger.info("==================== 珠宝全业务流水线【开始执行】 编号:{} ====================", sn);
            sleepMs(50);
 
            //1 客户洽谈
            negotiateService.customerTalk("深圳高端私人客户", "18K金一克拉钻戒定制,六爪镶嵌");
            sleepMs(50);
 
            //2 原料采购核验
            boolean purchasePass = purchaseService.purchaseCheck("黄金", new BigDecimal("62.8"));
            if (!purchasePass) {
                logger.error("原料核验失败,流水线强制终止");
                return;
            }
            sleepMs(50);
 
            //3 设计制图
            designService.createDraft(sn, "黄金", new BigDecimal("62.8"),
                    "六爪镶嵌钻戒,戒圈防滑磨砂,主钻1克拉,副钻环绕点缀");
            sleepMs(50);
 
            //4 加工生产
            produceService.startProduce(sn, "镶嵌+精细抛光");
            sleepMs(50);
 
            //5 质检
            inspectService.doInspect(sn);
            sleepMs(50);
 
            //6 包装
            packageService.packageGoods(sn, "高端实木珍藏礼盒");
            sleepMs(50);
 
            //7 物流
            logisticsService.sendDelivery("WL20260805001", "广东省深圳市福田珠宝产业园");
            sleepMs(50);
 
            //8 财务记账
            financeService.createBill(sn, new BigDecimal("36800"));
            sleepMs(50);
 
            //9 营销活动
            marketingService.launchActivity("七夕钻戒特惠定制活动");
            sleepMs(50);
 
            //10 人事排班
            hrService.staffManage("车间班组人员轮班调整");
            sleepMs(50);
 
            //11 IT运维
            itService.systemMaintain("订单数据库索引优化、性能巡检");
            sleepMs(50);
 
            //12 员工培训
            trainService.arrangeTrain("新设计师小张", "钻石镶嵌工艺进阶课程");
 
            logger.info("==================== 珠宝全业务流水线【全部执行完毕】 编号:{} ====================", sn);
        });
    }
 
    /**
     * 线程休眠
     */
    private void sleepMs(long ms) {
        try {
            TimeUnit.MILLISECONDS.sleep(ms);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.warn("线程休眠中断", e);
        }
    }
}
java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:32
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BusinessNegotiateService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
/**
 * 业务9:客户业务洽谈服务
 */
public class BusinessNegotiateService extends BaseService<BusinessNegotiateService> {
    public void customerTalk(String customerName, String demand) {
        logger.info("【业务洽谈】客户:{},定制需求:{}", customerName, demand);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:25
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : DesignDrawService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
import MementoPattern.Pattern.Memento.BusinessOriginator;
import MementoPattern.Pattern.Memento.JewelryBusinessMemento;
import MementoPattern.Pattern.Memento.MementoCaretaker;
 
import java.math.BigDecimal;
 
/**
 * 业务2:珠宝设计制图服务
 * 职责:图纸创建、状态更新、快照存档
 */
public class DesignDrawService extends BaseService<DesignDrawService> {
    private final BusinessOriginator originator;
    private final MementoCaretaker caretaker;
 
    public DesignDrawService(BusinessOriginator originator, MementoCaretaker caretaker) {
        this.originator = originator;
        this.caretaker = caretaker;
    }
 
    /**
     * 创建设计图纸并自动快照存档
     * @param businessSn 业务编号
     * @param material 绑定原料
     * @param weight 原料重量
     * @param designText 图纸详情
     */
    public void createDraft(String businessSn, String material, BigDecimal weight, String designText) {
        logger.info("【珠宝设计制图】{}开始绘制图纸", businessSn);
        originator.setCurrentBusinessSn(businessSn);
        originator.setCurrentMaterial(material);
        originator.setCurrentWeight(weight);
        originator.setCurrentDesign(designText);
        //生成快照存档
        JewelryBusinessMemento snap = originator.createMemento();
        caretaker.addMemento(snap);
        logger.debug("图纸内容:{}", designText);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:31
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : FinanceAccountService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
import MementoPattern.Pattern.Memento.BusinessOriginator;
import MementoPattern.Pattern.Memento.JewelryBusinessMemento;
import MementoPattern.Pattern.Memento.MementoCaretaker;
 
import java.math.BigDecimal;
 
/**
 * 业务7:财务记账核算服务
 */
public class FinanceAccountService extends BaseService<FinanceAccountService> {
    private final BusinessOriginator originator;
    private final MementoCaretaker caretaker;
 
    public FinanceAccountService(BusinessOriginator originator, MementoCaretaker caretaker) {
        this.originator = originator;
        this.caretaker = caretaker;
    }
 
    public void createBill(String businessSn, BigDecimal amount) {
        logger.info("【财务记账】{}入账金额:{}元", businessSn, amount);
        originator.setCurrentBusinessSn(businessSn);
        originator.setCurrentAmount(amount);
        JewelryBusinessMemento snap = originator.createMemento();
        caretaker.addMemento(snap);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:33
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : HrAdminService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
/**
 * 业务10:人事行政管理服务
 */
public class HrAdminService extends BaseService<HrAdminService> {
    public void staffManage(String operate) {
        logger.info("【人事行政】执行人员管理操作:{}", operate);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:33
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ItOperationService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
/**
 * 业务11:IT系统运维服务
 */
public class ItOperationService extends BaseService<ItOperationService> {
    public void systemMaintain(String workDetail) {
        logger.info("【IT运维】执行维护任务:{}", workDetail);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:31
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LogisticsService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
/**
 * 业务6:物流配送服务
 */
public class LogisticsService extends BaseService<LogisticsService> {
    public void sendDelivery(String deliveryNo, String address) {
        logger.info("【物流发货】单号{}下发配送,收货地址:{}", deliveryNo, address);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:32
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MarketingPromoteService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
/**
 * 业务8:营销推广服务
 */
public class MarketingPromoteService extends BaseService<MarketingPromoteService> {
    public void launchActivity(String activityName) {
        logger.info("【营销推广】活动[{}]全渠道上线", activityName);
        logger.debug("门店、电商、短视频渠道同步投放预热");
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:24
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MaterialPurchaseService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
import java.util.Set;
 
/**
 * 业务1:原料采购核验服务
 * 职责:原料合法性校验、入库判定、日志记录
 */
public class MaterialPurchaseService extends BaseService<MaterialPurchaseService> {
    private static final Set<String> LEGAL_MATERIALS = Set.of("黄金", "铂金", "钻石", "玉石");
 
    /**
     * 原料采购入库核验
     * @param materialName 原料名称:黄金/铂金/钻石/玉石
     * @param weight 原料重量g
     * @return true核验通过入库,false驳回
     */
    public boolean purchaseCheck(String materialName, java.math.BigDecimal weight) {
        logger.info("【原料采购核验】原料:{},重量:{}g", materialName, weight);
        boolean legalMaterial = LEGAL_MATERIALS.contains(materialName);
        boolean legalWeight = weight.compareTo(java.math.BigDecimal.ZERO) > 0;
        boolean pass = legalMaterial && legalWeight;
 
        if (pass) {
            logger.info("原料核验通过,准许入库登记");
        } else {
            logger.error("原料非法/重量异常,驳回入库申请");
        }
        return pass;
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:30
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : PackageService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
/**
 * 业务5:成品包装服务
 * 职责:礼盒封装、防伪绑定
 */
public class PackageService extends BaseService<PackageService> {
    public void packageGoods(String businessSn, String boxType) {
        logger.info("【成品包装】{}使用{}礼盒封装", businessSn, boxType);
        logger.debug("防伪标签、珠宝鉴定证书绑定完成");
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:28
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ProduceProcessService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
import MementoPattern.Pattern.Memento.BusinessOriginator;
import MementoPattern.Pattern.Memento.JewelryBusinessMemento;
import MementoPattern.Pattern.Memento.MementoCaretaker;
 
import java.util.Random;
 
/**
 * 业务3:加工生产服务
 * 职责:下发加工任务、进度监控、工艺记录
 */
public class ProduceProcessService extends BaseService<ProduceProcessService> {
    private static final Random RANDOM = new Random();
    private final BusinessOriginator originator;
    private final MementoCaretaker caretaker;
 
    public ProduceProcessService(BusinessOriginator originator, MementoCaretaker caretaker) {
        this.originator = originator;
        this.caretaker = caretaker;
    }
 
    /**
     * 启动加工任务
     * @param businessSn 业务编号
     * @param craft 工艺:镶嵌/雕花/抛光/拉丝
     */
    public void startProduce(String businessSn, String craft) {
        logger.info("【加工生产】{}启动{}工艺加工", businessSn, craft);
        originator.setCurrentBusinessSn(businessSn);
        originator.setCurrentCraft(craft);
        int progress = RANDOM.nextInt(20, 101);
        logger.debug("实时加工进度:{}%", progress);
        JewelryBusinessMemento snap = originator.createMemento();
        caretaker.addMemento(snap);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/5 - 22:28
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : QualityInspectService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
import MementoPattern.Pattern.Memento.BusinessOriginator;
import MementoPattern.Pattern.Memento.JewelryBusinessMemento;
import MementoPattern.Pattern.Memento.MementoCaretaker;
 
import java.math.BigDecimal;
import java.util.Random;
 
/**
 * 业务4:成品质检服务
 * 职责:质量打分、等级判定、快照存档
 */
public class QualityInspectService extends BaseService<QualityInspectService> {
    private static final Random RANDOM = new Random();
    private final BusinessOriginator originator;
    private final MementoCaretaker caretaker;
 
    public QualityInspectService(BusinessOriginator originator, MementoCaretaker caretaker) {
        this.originator = originator;
        this.caretaker = caretaker;
    }
 
    /**
     * 执行质检
     * @param businessSn 业务编号
     * @return 质检分数
     */
    public BigDecimal doInspect(String businessSn) {
        logger.info("【成品质量检测】开始检测{}", businessSn);
        BigDecimal score = BigDecimal.valueOf(RANDOM.nextInt(600, 1000)).divide(BigDecimal.TEN);
        originator.setCurrentBusinessSn(businessSn);
        originator.setCurrentScore(score);
        JewelryBusinessMemento snap = originator.createMemento();
        caretaker.addMemento(snap);
 
        if (score.compareTo(BigDecimal.valueOf(90)) >= 0) {
            logger.info("质检合格,评级优等");
        } else if (score.compareTo(BigDecimal.valueOf(70)) >= 0) {
            logger.warn("质检待复检,评级中等");
        } else {
            logger.error("质检不合格,判定报废");
        }
        return score;
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento Pattern
 * 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/8/6 - 22:34
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : StaffTrainService.java
 * explain   : 学习  类
 **/
 
package MementoPattern.Business;
 
import MementoPattern.Core.Base.BaseService;
 
/**
 * 业务12:员工工艺培训服务
 */
public class StaffTrainService extends BaseService<StaffTrainService> {
    public void arrangeTrain(String traineeName, String course) {
        logger.info("【员工培训】为{}安排{}课程", traineeName, course);
    }
}

调用:

java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  备忘录模式 Memento 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:06
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MementoBll.java
 * explain   : 学习  类
 **/
 
package BLL;
 
import MementoPattern.Core.Logging.LoggerBuildFactory;
import MementoPattern.Workflow.IWorkflowSchedule;
import MementoPattern.Workflow.JewelryWholeWorkflowScheduler;
 
 
public class MementoBll {
 
    public void demo(){
        //1、全局日志初始化
        LoggerBuildFactory.buildGlobalLogger();
 
        //2、手动创建调度器执行流水线(替代Spring容器)
        IWorkflowSchedule scheduler = new JewelryWholeWorkflowScheduler();
        scheduler.runWholeWorkflowAsync().join();
    }
}
相关推荐
星哥的编程之路1 小时前
万字深度解析 Agent 学习路线
后端
xcLeigh1 小时前
Unity基础:Start与Update方法——Unity脚本生命周期初探
java·unity·游戏引擎·教程
程序边界1 小时前
SQL Server数据迁移这件事,远比你想的复杂——但也远比你想的简单(下)
后端
zephyr051 小时前
链表实现O(n log n)时间复杂度的排序——归并排序详解
java·数据结构·算法
曾阿伦1 小时前
Trae CN Python环境调试debug指南
开发语言·python
Zane19941 小时前
JRE 去哪了?一次讲清楚 JDK、JRE、JVM 到底是什么关系?
java·后端
JavaPub1 小时前
Ontology 本体论是什么?从哲学概念到 AI、知识图谱与软件工程
后端
PPPPickup1 小时前
基础知识差缺补漏-面试版持续更新
java·开发语言
liuxiaocheng1 小时前
聊聊 Vercel AI SDK 的流式协议:前后端到底是怎么"边想边说"的
前端·后端