java: Memento Pattern

项目结构:

image

 

/**
 * 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);
        }
    }
}

  

/**
 * 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);
    }
}

  

调用:

/**
 * 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();
    }
}

  

 

posted @ 2026-08-07 00:01  ®Geovin Du Dream Park™  阅读(4)  评论(0)    收藏  举报