package com.mathgenerator.service; import com.mathgenerator.model.User; import com.mathgenerator.model.Level; import com.mathgenerator.service.strategy.PaperStrategy; // 导入策略接口 import com.mathgenerator.storage.FileManager; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 它现在依赖一个PaperStrategy来决定题目组合方式。 */ public class PaperService { private final FileManager fileManager; private final PaperStrategy paperStrategy; // 持有策略接口的引用 /** * PaperService的构造函数。 *

* 通过构造函数注入其依赖的文件管理器和试卷组合策略。 * 这种设计遵循了依赖注入(DI)原则,增强了代码的模块化和可测试性。 * * @param fileManager 用于处理文件读写的FileManager实例。 * @param paperStrategy 用于决定题目组合方式的PaperStrategy实例。 */ public PaperService(FileManager fileManager, PaperStrategy paperStrategy) { this.fileManager = fileManager; this.paperStrategy = paperStrategy; } /** * 创建并保存一份完整的试卷。 *

* 这是该服务的核心方法。它 orchestrates 整个流程: * 1. 加载指定用户的历史题目以进行查重。 * 2. 进入循环,委托给注入的 {@link PaperStrategy} 来动态选择题目生成器。 * 3. 生成新题目并进行查重,直到满足指定的题目数量。 * 4. 调用 {@link FileManager} 将最终的试卷内容保存到文件中。 * * @param user 当前已登录的用户对象。 * @param count 需要生成的题目数量。 * @param currentLevel 用户当前选择的主难度级别。 */ public void createAndSavePaper(User user, int count, Level currentLevel) { Set existingQuestions = fileManager.loadExistingQuestions(user.username()); List newPaper = new ArrayList<>(); Set generatedInSession = new HashSet<>(); System.out.println("正在根据策略生成题目,请稍候..."); while (newPaper.size() < count) { // 将选择生成器的逻辑委托给策略对象 String question = paperStrategy.selectGenerator(currentLevel).generateSingleQuestion(); if (!existingQuestions.contains(question) && !generatedInSession.contains(question)) { newPaper.add(question); generatedInSession.add(question); } } try { String filePath = fileManager.savePaper(user.username(), newPaper); System.out.println("成功!" + count + "道"+ currentLevel.getChineseName() + "数学题目已生成。"); System.out.println("文件已保存至: " + filePath); } catch (IOException e) { System.err.println("错误:保存文件失败 - " + e.getMessage()); } } }