跪拜 Guibai
← Back to the summary

A Spring Boot 4.1 DDD Scaffold Built to Be Read by AI, Not Just Humans

Spring Boot 4.1 + JDK 25 DDD Open-Source Scaffold, Oriented Towards AI Programming

Next-Generation Java Enterprise Development Scaffold - Based on the new Spring Boot and JDK, strictly following DDD architecture, ready to use out of the box, creating best practices for AI programming.

Why Choose This Scaffold?

Based on Spring Boot 4.1 and JDK 25, strictly following DDD architectural design, with built-in multi-data source support, ready to use out of the box. It consolidates unified engineering standards and best practices, providing high-quality context for AI Coding to achieve more accurate and consistent code generation. In 2026, transitioning to AI programming starts with the latest scaffold. This code is not just for you to read; it is also for AI to read, used to guide AI on what architecture to follow when writing code.

Core Features

Elegant Architecture

graph TB
    subgraph Interface Layer
        A[UserController] --> B[UserService]
        C[OrderController] --> D[OrderService]
    end
    
    subgraph Application Layer
        B --> E[UserRepository]
        D --> F[OrderRepository]
        B --> G[CacheService]
        D --> H[DomainEventPublisher]
    end
    
    subgraph Domain Layer
        E --> I[User Aggregate Root]
        F --> J[Order Aggregate Root]
        I --> K[UserUniquenessChecker]
        J --> L[OrderDomainService]
    end
    
    subgraph Infrastructure Layer
        E --> M[UserRepositoryImpl]
        F --> N[OrderJdbcRepository]
        M --> O[(MySQL)]
        N --> P[(PostgreSQL)]
        G --> Q[(Redis)]
        H --> R[RocketMQ]
    end
    
    style A fill:#e3f2fd,stroke:#2196f3,stroke-width:2px
    style B fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style C fill:#e3f2fd,stroke:#2196f3,stroke-width:2px
    style D fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style E fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px
    style F fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px
    style G fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
    style H fill:#fce4ec,stroke:#e91e63,stroke-width:2px
    style I fill:#ffe1f5,stroke:#e91e63,stroke-width:3px
    style J fill:#ffe1f5,stroke:#e91e63,stroke-width:3px
    style K fill:#e0f7fa,stroke:#00bcd4,stroke-width:2px
    style L fill:#e0f7fa,stroke:#00bcd4,stroke-width:2px
    style M fill:#e1ffe1,stroke:#4caf50,stroke-width:2px
    style N fill:#e1ffe1,stroke:#4caf50,stroke-width:2px
    style O fill:#ffcdd2,stroke:#f44336,stroke-width:3px
    style P fill:#c8e6c9,stroke:#4caf50,stroke-width:3px
    style Q fill:#fff9c4,stroke:#ffc107,stroke-width:3px
    style R fill:#d1c4e9,stroke:#673ab7,stroke-width:3px

Core Advantages

Feature Traditional Project This Scaffold Benefit
Architecture Setup 1-2 weeks 10 minutes 90%+ Time Saved
Code Standards Relies on self-discipline Enforced constraints 📏 Architectural Consistency
Multi-Data Source Manual configuration Out of the box 🔌 Plug and Play
Domain Modeling Lacks guidance DDD Best Practices 🎯 Clear Business Logic
Tech Stack Outdated versions Latest stable 🚀 Technologically Advanced

Source Code Address: https://github.com/microwind/design-patterns/tree/main/practice-projects/springboot4ddd


Tech Stack and Advantages

Core Technical Architecture

graph LR
    A[JDK 25 LTS] --> B[Spring Boot 4.1]
    B --> C[Spring Data JDBC]
    B --> D[MyBatis Plus]
    B --> E[JdbcClient]
    
    C --> F[(MySQL 8.0)]
    C --> G[(PostgreSQL 14)]
    E --> F
    D --> F
    
    B --> H[RocketMQ 5.3]
    B --> I[Redis 6.0]
    
    style A fill:#ff6b6b,stroke:#e53935,stroke-width:3px
    style B fill:#4ecdc4,stroke:#009688,stroke-width:3px
    style C fill:#ffe66d,stroke:#ffc107,stroke-width:2px
    style D fill:#95e1d3,stroke:#26a69a,stroke-width:2px
    style E fill:#f38181,stroke:#ef5350,stroke-width:2px
    style F fill:#aa96da,stroke:#7e57c2,stroke-width:3px
    style G fill:#fcbad3,stroke:#ec407a,stroke-width:3px
    style H fill:#a8d8ea,stroke:#039be5,stroke-width:2px
    style I fill:#ff9a9e,stroke:#f44336,stroke-width:2px

Database Operation Technologies

Technology Version Purpose Features
JdbcClient - Data Access Spring's latest JDBC method, fluent API, type-safe, simplified parameter binding
Spring Data JDBC - ORM Framework Lightweight, conforms to DDD concepts, no JPA complexity
MyBatis Plus 3.5.16 SQL Enhancement Powerful SQL enhancement, supports complex queries, code generator improves efficiency
Multi-Data Source - Data Source Management HikariCP connection pool, independent transaction management, graceful degradation mechanism

Message Queue and Cache

Technology Version Purpose Features
RocketMQ 5.3+ Message Queue Event-driven architecture, domain event publishing, graceful degradation, topic isolation
Redis 6.0+ Cache Distributed cache, performance optimization, supports multiple data structures, cluster mode

Security and Authentication

Feature Description
API Signature Verification Built-in complete interface security authentication mechanism to prevent request tampering
Unified Response Format Standardized API response structure, easy for front-end processing
Global Exception Handling Graceful error catching and response, unified error code system
Parameter Validation Data validation based on Jakarta Validation, automatic validation of request parameters

DDD Architecture Design

Four-Layer Architecture

graph TB
    subgraph Interface Layer
        direction TB
        A1[Controllers]
        A2[VOs]
        A3[DTOs Conversion]
    end
    
    subgraph Application Layer
        direction TB
        B1[Application Services]
        B2[Commands]
        B3[Ports & Adapters]
    end
    
    subgraph Domain Layer
        direction TB
        C1[Aggregate Roots]
        C2[Domain Services]
        C3[Domain Events]
        C4[Repository Interfaces]
    end
    
    subgraph Infrastructure Layer
        direction TB
        D1[Repository Implementations]
        D2[External Service Integration]
        D3[Persistence]
    end
    
    A1 --> B1
    B1 --> C4
    C4 --> D1
    D1 --> D3
    
    style A1 fill:#e3f2fd,stroke:#2196f3,stroke-width:2px
    style A2 fill:#bbdefb,stroke:#1976d2,stroke-width:1px
    style A3 fill:#90caf9,stroke:#1565c0,stroke-width:1px
    style B1 fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style B2 fill:#ffe0b2,stroke:#f57c00,stroke-width:1px
    style B3 fill:#ffcc80,stroke:#ef6c00,stroke-width:1px
    style C1 fill:#f3e5f5,stroke:#9c27b0,stroke-width:3px
    style C2 fill:#e1bee7,stroke:#8e24aa,stroke-width:2px
    style C3 fill:#ce93d8,stroke:#7b1fa2,stroke-width:2px
    style C4 fill:#ba68c8,stroke:#6a1b9a,stroke-width:2px,color:#fff
    style D1 fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
    style D2 fill:#c8e6c9,stroke:#388e3c,stroke-width:1px
    style D3 fill:#a5d6a7,stroke:#2e7d32,stroke-width:1px

Domain Model Example

classDiagram
    class User {
        -Long id
        -String name
        -String email
        -String phone
        +register(checker, name, email, phone) User
        +changeEmail(checker, newEmail) void
        +changePhone(newPhone) void
    }
    
    class Order {
        -Long id
        -String orderNo
        -Long userId
        -BigDecimal totalAmount
        -OrderStatus status
        +create(userId, amount) Order
        +pay() void
        +cancel() void
        +complete() void
    }
    
    class UserRepository {
        <<interface>>
        +save(user) User
        +findById(id) Optional~User~
        +findByName(name) Optional~User~
    }
    
    class OrderRepository {
        <<interface>>
        +save(order) Order
        +findById(id) Optional~Order~
        +findByUserId(userId) List~Order~
    }
    
    User  -->  UserRepository
    Order -->  OrderRepository

Multi-Data Source Architecture

Data Source Configuration

graph TB
    subgraph Application Startup
        A[Application] --> B[DataSourceConfig]
    end
    
    subgraph Data Source Configuration
        B --> C[userHikariConfig]
        B --> D[orderHikariConfig]
        
        C --> E[(MySQL DataSource)]
        D --> F[(PostgreSQL DataSource)]
    end
    
    subgraph JDBC Clients
        E --> G[userJdbcClient]
        F --> H[orderJdbcClient]
        
        E --> I[userTransactionManager]
        F --> J[orderTransactionManager]
    end
    
    subgraph Repository Layer
        G --> K[UserRepositoryImpl]
        H --> L[OrderJdbcRepository]
    end
    
    subgraph Data Storage
        K --> M[(MySQL<br/>User Data)]
        L --> N[(PostgreSQL<br/>Order Data)]
    end
    
    style A fill:#e3f2fd,stroke:#2196f3,stroke-width:2px
    style B fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style C fill:#ffebee,stroke:#f44336,stroke-width:2px
    style D fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
    style E fill:#ffcdd2,stroke:#e53935,stroke-width:3px
    style F fill:#c8e6c9,stroke:#43a047,stroke-width:3px
    style G fill:#bbdefb,stroke:#1976d2,stroke-width:2px
    style H fill:#ffcc80,stroke:#f57c00,stroke-width:2px
    style I fill:#90caf9,stroke:#1565c0,stroke-width:2px
    style J fill:#ffb74d,stroke:#ef6c00,stroke-width:2px
    style K fill:#64b5f6,stroke:#0d47a1,stroke-width:2px
    style L fill:#ffab91,stroke:#e65100,stroke-width:2px
    style M fill:#ef5350,stroke:#c62828,stroke-width:4px,color:#fff
    style N fill:#66bb6a,stroke:#2e7d32,stroke-width:4px,color:#fff

Transaction Management Strategy

graph LR
    A[UserService] -->|userTransactionManager| B[MySQL Transaction]
    C[OrderService] -->|orderTransactionManager| D[PostgreSQL Transaction]
    
    E[Cross-Aggregate Operation] --> F[Application Service Orchestration]
    F --> G[Eventual Consistency]
    G --> H[Domain Events]
    H --> I[RocketMQ]
    
    style A fill:#bbdefb,stroke:#1976d2,stroke-width:2px
    style B fill:#ffcdd2,stroke:#d32f2f,stroke-width:3px
    style C fill:#ffccbc,stroke:#e64a19,stroke-width:2px
    style D fill:#c8e6c9,stroke:#388e3c,stroke-width:3px
    style E fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
    style F fill:#ffe082,stroke:#f9a825,stroke-width:2px
    style G fill:#ffd54f,stroke:#f57f17,stroke-width:2px
    style H fill:#ffab91,stroke:#e64a19,stroke-width:2px
    style I fill:#c5cae9,stroke:#5e35b1,stroke-width:3px

Event-Driven Architecture

RocketMQ Message Architecture

graph TB
    subgraph Domain Layer
        A[Order Aggregate Root] --> B[OrderCreatedEvent]
        A --> C[OrderPaidEvent]
        A --> D[OrderCancelledEvent]
        A --> E[OrderCompletedEvent]
    end
    
    subgraph Infrastructure Layer
        F[DomainEventPublisher] --> G[RocketMQTemplate]
        G --> H[RocketMQConfig]
    end
    
    subgraph RocketMQ Message Queue
        H --> I[order-events Topic]
        I --> J[OrderCreatedEvent Tag]
        I --> K[OrderPaidEvent Tag]
        I --> L[OrderCancelledEvent Tag]
        I --> M[OrderCompletedEvent Tag]
    end
    
    subgraph Consumers
        N[Order Service Consumer] --> I
        O[Notification Service Consumer] --> I
        P[Statistics Service Consumer] --> I
    end
    
    B --> F
    C --> F
    D --> F
    E --> F
    
    style A fill:#f3e5f5,stroke:#9c27b0,stroke-width:3px
    style B fill:#e1f5fe,stroke:#039be5,stroke-width:2px
    style C fill:#e1f5fe,stroke:#039be5,stroke-width:2px
    style D fill:#e1f5fe,stroke:#039be5,stroke-width:2px
    style E fill:#e1f5fe,stroke:#039be5,stroke-width:2px
    style F fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style G fill:#ffe0b2,stroke:#f57c00,stroke-width:2px
    style H fill:#ffcc80,stroke:#ef6c00,stroke-width:2px
    style I fill:#c5cae9,stroke:#673ab7,stroke-width:4px
    style J fill:#ce93d8,stroke:#8e24aa,stroke-width:2px
    style K fill:#ce93d8,stroke:#8e24aa,stroke-width:2px
    style L fill:#ce93d8,stroke:#8e24aa,stroke-width:2px
    style M fill:#ce93d8,stroke:#8e24aa,stroke-width:2px
    style N fill:#a5d6a7,stroke:#43a047,stroke-width:2px
    style O fill:#a5d6a7,stroke:#43a047,stroke-width:2px
    style P fill:#a5d6a7,stroke:#43a047,stroke-width:2px

Message Publishing Flow

sequenceDiagram
    participant User as User
    participant Order as Order Aggregate Root
    participant Publisher as Event Publisher
    participant RocketMQ as RocketMQ
    participant Consumer as Consumer
    
    User->>Order: Create Order
    Order->>Order: pay()
    Order->>Order: Record Domain Event
    Order->>Publisher: Publish OrderPaidEvent
    Publisher->>RocketMQ: Send Message to order-events
    RocketMQ->>Consumer: Push Message
    Consumer->>Consumer: Process Business Logic
    
    Note over Order,RocketMQ: Event-driven architecture ensures eventual consistency

RocketMQ Configuration Features

Message Types

Event Type Tag Description Trigger Timing
OrderCreatedEvent OrderCreatedEvent Order creation event After the order is first saved
OrderPaidEvent OrderPaidEvent Order payment event When the order payment is successful
OrderCancelledEvent OrderCancelledEvent Order cancellation event When the order is cancelled
OrderCompletedEvent OrderCompletedEvent Order completion event When the order is completed

Configuration Example

rocketmq:
  name-server: localhost:9876
  producer:
    group: order-producer-group
  consumer:
    group: order-consumer-group
  fallback:
    enabled: true  # Enable graceful degradation

Project Structure

springboot4ddd/
├── src/main/java/com/github/microwind/springboot4ddd/
│   ├── interfaces/              # Interface Layer
│   │   ├── controller/          # REST Controllers
│   │   ├── vo/                  # View Objects
│   │   └── annotation/          # Custom Annotations
│   │
│   ├── application/            # Application Layer
│   │   ├── service/            # Application Services
│   │   ├── command/            # Command Objects
│   │   ├── dto/                # Data Transfer Objects
│   │   └── port/               # Port Interfaces
│   │
│   ├── domain/                 # Domain Layer
│   │   ├── model/              # Domain Models
│   │   ├── repository/         # Repository Interfaces
│   │   ├── service/            # Domain Services
│   │   └── event/              # Domain Events
│   │
│   └── infrastructure/         # Infrastructure Layer
│       ├── repository/         # Repository Implementations
│       ├── config/             # Configuration Classes
│       ├── client/             # External Service Clients
│       └── messaging/          # Message Handling
│
├── src/main/resources/
│   ├── application.yml         # Main Configuration File
│   ├── application-dev.yml     # Development Environment Configuration
│   └── application-prod.yml    # Production Environment Configuration
│
└── pom.xml                     # Maven Configuration

Quick Start

1. Get the Scaffold

Method 1: Clone the Full Repository

git clone https://github.com/microwind/design-patterns.git
cd design-patterns/practice-projects/springboot4ddd

Method 2: Pull on Demand (Recommended)

# Use sparse-checkout to only pull the springboot4ddd directory
git clone --no-checkout https://github.com/microwind/design-patterns.git
cd design-patterns
git sparse-checkout init --cone
git sparse-checkout set practice-projects/springboot4ddd
git checkout
cd practice-projects/springboot4ddd

2. Environment Requirements

3. Configure Data Sources

Edit src/main/resources/application-dev.yml:

spring:
  user:
    datasource:
      jdbc-url: jdbc:mysql://localhost:3306/user_db
      username: root
      password: password
  order:
    datasource:
      jdbc-url: jdbc:postgresql://localhost:5432/order_db
      username: postgres
      password: password

4. Start the Application

./mvnw spring-boot:run

5. Access the API

# Create User
curl -X POST http://localhost:8080/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"Zhang San","email":"[email protected]","phone":"13800138000"}'

# Query User
curl http://localhost:8080/api/users/1

# Create Order
curl -X POST http://localhost:8080/api/orders \
  -H "Content-Type: application/json" \
  -d '{"userId":1,"totalAmount":99.99}'

Agent CLI Programming Guide

Using the Scaffold in Agent CLI Mode

# 1. Enter the new project directory
cd your-new-project

# 2. Start Agent CLI (e.g., Claude Code, Codex CLI, Cursor Agent, etc.)
claude-code

# 3. Specify the DDD scaffold as a reference project
Please use the `springboot4ddd` scaffold as a reference:
<Scaffold project actual path>

Focus on referencing the following:
- pom.xml (Dependencies and tech stack)
- src/main/java/com/github/microwind/springboot4ddd/infrastructure/config/DataSourceConfig.java (Multi-data source configuration)
- src/main/java/com/github/microwind/springboot4ddd/infrastructure/repository/user/UserRepositoryImpl.java (Repository implementation example)
- src/main/java/com/github/microwind/springboot4ddd/domain/model/user/User.java (Domain model example)

# 4. Generate code using the scaffold as a blueprint
Please reference the project structure, coding standards, and best practices of this scaffold to generate code in the current project, and follow these constraints:

【Architectural Layering】
- interfaces/: Interface layer, containing Controller, DTO, VO
- application/: Application layer, containing Application Service, Command, Query
- domain/: Domain layer, containing domain models, domain services, repository interfaces
- infrastructure/: Infrastructure layer, containing repository implementations, configuration, database access

【Technical Specifications】
- Use Spring Boot 4.1 + JDK 25
- Use JdbcClient for data access
- Support multi-data sources, specify data source via @Qualifier
- Use @Transactional to specify transaction manager
- Publish domain events uniformly through DomainEventPublisher
- Use a unified global exception handling mechanism

【Coding Standards】
- Keep the domain layer pure, do not depend on Spring
- Repository interfaces are in the Domain layer, implementations are in the Infrastructure layer
- Prefer the Builder pattern for creating complex objects
- Follow DDD, SOLID, and Single Responsibility principles
- Maintain a code style and directory structure consistent with the reference scaffold

Please use this scaffold as a blueprint to implement the following in the current project:

【Your Requirements】
- xxx

Agent CLI Best Practices

  1. Context Preloading - Before starting a task, let the Agent read key configuration files and existing implementations first.
  2. Explicit Architectural Constraints - Reiterate the architectural standards that must be followed at the beginning of each task.
  3. Step-by-Step Execution - Break down complex tasks into multiple steps and implement them gradually.
  4. Code Review - Let the Agent check whether the generated code conforms to the DDD architecture and project standards.
  5. Continuous Feedback - Adjust prompts based on generation results to optimize the Agent's understanding.

Common CLI Prompt Templates

Creating a New Aggregate Root:

Please refer to the implementation of the User aggregate root to create a new [Aggregate Root Name] aggregate root under domain/model/:
1. Place the domain model in the domain/model/ directory.
2. Do not depend on any Spring annotations.
3. Use static factory methods to create instances.
4. Include business logic validation.
5. Create the corresponding repository interface in domain/repository/.

Implementing the Repository Layer:

Please refer to the implementation of UserRepositoryImpl to create [Repository Name]Impl under infrastructure/repository/:
1. Use JdbcClient for database operations.
2. Inject the corresponding data source via @Qualifier.
3. Implement the repository interface defined in the domain layer.
4. Use the fluent JdbcClient API style.

Adding Domain Events:

Please refer to the existing domain event implementations to add domain events for [Aggregate Root Name]:
1. Create an event class under domain/event/.
2. Record the domain event in the aggregate root.
3. Publish the event through DomainEventPublisher.
4. Create a message converter under infrastructure/messaging/.

Core Features

1. JdbcClient Usage Example

// Traditional JdbcTemplate
String sql = "SELECT * FROM users WHERE id = ?";
User user = jdbcTemplate.queryForObject(sql, userRowMapper, id);

// New JdbcClient (Recommended)
User user = jdbcClient.sql("SELECT * FROM users WHERE id = ?")
    .param(id)
    .query((rs, rowNum) -> mapToUser(rs))
    .optional()
    .orElseThrow();

2. Multi-Data Source Transactions

@Service
@Transactional(transactionManager = "userTransactionManager")
public class UserService {
    // Automatically uses MySQL transaction manager
}

@Service  
@Transactional(transactionManager = "orderTransactionManager")
public class OrderService {
    // Automatically uses PostgreSQL transaction manager
}

3. Domain Event Publishing

public class Order {
    public void pay() {
        this.status = OrderStatus.PAID;
        recordEvent(new OrderPaidEvent(this.id, this.orderNo));
    }
}

4. Aggregate Root Design

// Pure domain model, no framework dependencies
public class User {
    // Private constructor, forces use of factory methods
    private User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
    
    // Static factory method
    public static User register(UserUniquenessChecker checker, 
                               String name, String email) {
        if (checker.existsByName(name)) {
            throw new UniquenessViolationException("Username already exists");
        }
        return new User(null, name, email);
    }
}

Learning Resources

DDD Core Concepts

image.png

Applicable Scenarios

Applicable to all scenarios under AI programming, it can make your code structure clearer and prevent AI from going off track.


Best Practices

1. Keep the Domain Layer Pure

// ✅ Correct - Domain layer has no framework dependencies
package com.github.microwind.springboot4ddd.domain.model.user;

public class User {
    // Pure Java code, no Spring annotations
    private Long id;
    private String name;
    
    public static User register(String name, String email) {
        // Business logic
        return new User(null, name, email);
    }
}

// ❌ Incorrect - Domain layer contains framework dependencies
@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    
    @Autowired
    private UserRepository repository;
}

2. Repository Interfaces in the Domain Layer

// ✅ Correct - Interface is in the domain layer
package com.github.microwind.springboot4ddd.domain.repository;

public interface UserRepository {
    User save(User user);
    Optional<User> findById(Long id);
}

// Implementation is in the infrastructure layer
package com.github.microwind.springboot4ddd.infrastructure.repository;

@Repository
public class UserRepositoryImpl implements UserRepository {
    private final JdbcClient jdbcClient;
    
    @Override
    public User save(User user) {
        // JdbcClient implementation
    }
}

3. Application Service Orchestration

@Service
@RequiredArgsConstructor
public class OrderService {
    private final OrderRepository orderRepository;
    private final UserRepository userRepository;
    private final DomainEventPublisher eventPublisher;
    
    @Transactional
    public OrderDTO createOrder(CreateOrderCommand command) {
        // 1. Verify user exists
        User user = userRepository.findById(command.getUserId())
            .orElseThrow(() -> new EntityNotFoundException("User does not exist"));
        
        // 2. Create order domain object
        Order order = Order.create(user.getId(), command.getTotalAmount());
        
        // 3. Save order
        Order savedOrder = orderRepository.save(order);
        
        // 4. Publish domain event
        eventPublisher.publishOrderCreated(savedOrder);
        
        return OrderDTO.from(savedOrder);
    }
}

Target Audience

Target Developers:

Suitable for everyone transitioning to AI programming

Skill Improvement

Through this project, you can learn:


Related Resources


Start Your DDD Journey

git clone https://github.com/microwind/design-patterns.git
cd design-patterns/practice-projects/springboot4ddd
./mvnw spring-boot:run

In a few minutes, you will have a production-grade DDD application! 🚀

Comments

Top 1 from juejin.cn, machine-translated. The original thread is authoritative.

刀法如飞

AI Programming Architecture Design Collection: https://github.com/microwind/design-patterns