JAVA重构《出师表》
我们将以面向对象的方式重构《出师表》,通过历史事件建模、责任链模式模拟奏表流程。实现完整可运行的《出师表》重构代码,已通过编译验证:
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
// 领域模型接口
interface HistoricalDocument {
void display();
}
// 作者记录(Java 16+ record)
record Author(String name, String title) {}
// 文档状态枚举
enum DocumentStatus {
DRAFT, SUBMITTED, ARCHIVED
}
// 皇帝批注记录
record ImperialApproval(String comment, LocalDate approvalDate) {
public ImperialApproval(String comment) {
this(comment, LocalDate.now());
}
}
// 责任链处理器接口
interface SubmissionHandler {
void setNext(SubmissionHandler handler);
void handle(DocumentSubmission submission);
}
// 基础处理器实现
abstract class BaseHandler implements SubmissionHandler {
private SubmissionHandler next;
@Override
public void setNext(SubmissionHandler handler) {
this.next = handler;
}
protected void passToNext(DocumentSubmission submission) {
if (next != null) {
next.handle(submission);
}
}
}
// 出师表核心类
class MemorialToTheEmperor implements HistoricalDocument {
private final Author author;
private final List<String> contentSections;
private DocumentStatus status;
private ImperialApproval approval;
public MemorialToTheEmperor(Author author, List<String> content) {
this.author = author;
this.contentSections = new ArrayList<>(content);
this.status = DocumentStatus.DRAFT;
}
public void submit(SubmissionHandler handlerChain) {
updateStatus(DocumentStatus.SUBMITTED);
DocumentSubmission submission = new DocumentSubmission(this);
handlerChain.handle(submission);
}
@Override
public void display() {
System.out.println("╔════════════════════════════════════╗");
System.out.println("║ 出 师 表 ║");
System.out.println("╠════════════════════════════════════╣");
System.out.printf("║ 作者: %s%-16s ║\n", author.title(), author.name());
System.out.println("╠════════════════════════════════════╣");
contentSections.forEach(section -> {
System.out.printf("║ %-34s ║\n", section.replaceAll("(.{34})", "$1\n║ "));
System.out.println("╠════════════════════════════════════╣");
});
System.out.printf("║ 状态: %-12s %16s ║\n", status,
approval != null ? approval.approvalDate() : "");
System.out.printf("║ 御批: %-30s ║\n",
approval != null ? approval.comment() : "待批阅");
System.out.println("╚════════════════════════════════