3、Java 后端开发者必学设计模式实战手册

.NET开发者的精神手记:技术、人与决策现场 在.NET生态快速演进的背景下,技术选型已不再仅关乎语法特性或性能参数,而是一场融合业务理解、团队约束与长期可维护性的系统性决策。本文从.NET开发者的实际工作流切入,解析C#语言设计、ASP.NET Core中间件机制、EF Core运行时行为等核心组件背后的工程权衡逻辑;强调‘可维护性×可读性÷认知负荷’这一编程之美的量化表达,并揭示技术传播中被忽视的责任伦理——如何让每一篇博客成为真实生产环境中的决策支持工具,而非文档复述。聚焦.NET全栈耦合特性,拒绝泛化类比,回归Runtime、语言与框架三位一体 阅读详情

📘 Java 后端开发者必学设计模式实战手册

—— 23种经典模式中,真正值得你掌握的15种(附中文注释完整示例)

作者:资深 Java 架构师 · 一线实战经验沉淀
适用对象:Java 后端开发工程师(Spring Boot / 微服务 / 分布式系统)
目标:
✅ 不学“全”而学“精”
✅ 不背“名称”而懂“场景”
✅ 不写“样板”而能“实战”
✅ 所有代码均可直接复制到项目中运行(JDK 8+)


✅ 一、学习原则:不是23种都要学,而是这15种必须精通!

类别模式名称是否必须掌握推荐理由
创建型单例模式✅ 必须线程安全的全局唯一实例(连接池、配置)
工厂方法✅ 必须Spring 中大量使用,解耦对象创建
抽象工厂✅ 必须多套配置/数据库驱动切换场景
建造者✅ 必须构建复杂对象(SQL、DTO、请求体)
原型模式⚠️ 了解Java 中 clone() 用得少,了解即可
结构型适配器✅ 必须第三方接口兼容(微信/支付宝 SDK)
装饰器✅ 必须AOP、日志、缓存、加密等横切关注点
代理✅ 必须Spring AOP、远程调用、懒加载
外观✅ 必须微服务调用封装、子系统简化
桥接⚠️ 了解多维度扩展(如 JDBC + 驱动 + 池)
组合⚠️ 了解树形结构(菜单、组织架构)
享元⚠️ 了解字符串池、缓存小对象(面试常问)
行为型策略模式✅ 必须支付、折扣、排序、规则引擎
模板方法✅ 必须订单流程、审核流程、公共逻辑
观察者✅ 必须事件驱动、消息通知、异步解耦
责任链✅ 必须过滤器、权限校验、风控链
命令模式✅ 必须异步任务、操作回滚、MQ 消息
状态模式✅ 必须订单状态、流程状态机
中介者⚠️ 了解多对象通信复杂时(如聊天室)
备忘录⚠️ 了解撤销操作(如编辑器)
迭代器⚠️ 了解Java 集合已内置,无需手动实现
解释器❌ 不学仅用于 DSL 解析(如 SQL 引擎),后端极少用
访问者❌ 不学AST 解析、编译器场景,后端几乎不用

✅ 结论:你只需精通这 10~15 种即可应对 95% 的后端开发场景!
👉 优先掌握:单例、工厂、策略、模板、观察者、责任链、命令、状态、装饰器、代理、外观


✅ 二、15种核心设计模式详解(含中文注释完整代码)


🔹 1. 单例模式(Singleton)—— 全局唯一实例

适用场景:数据库连接池、Redis 客户端、配置管理器、日志记录器

/**
 * 饿汉式单例(线程安全,类加载时初始化)
 * 优点:简单、线程安全、无锁
 * 缺点:可能浪费内存(即使没用到也创建)
 */
public class DatabaseConnectionPool {
    // 私有静态实例,类加载时创建
    private static final DatabaseConnectionPool INSTANCE = new DatabaseConnectionPool();

    // 私有构造函数,防止外部 new
    private DatabaseConnectionPool() {
        System.out.println("✅ 数据库连接池已初始化");
    }

    // 公共静态方法,提供全局访问点
    public static DatabaseConnectionPool getInstance() {
        return INSTANCE;
    }

    // 模拟获取连接
    public void getConnection() {
        System.out.println("🔗 获取数据库连接...");
    }
}

// 使用示例
public class SingletonDemo {
    public static void main(String[] args) {
        DatabaseConnectionPool pool1 = DatabaseConnectionPool.getInstance();
        DatabaseConnectionPool pool2 = DatabaseConnectionPool.getInstance();
        System.out.println(pool1 == pool2); // true,证明是同一实例
        pool1.getConnection(); // 输出:🔗 获取数据库连接...
    }
}

✅ 推荐使用:饿汉式(简单安全)
❌ 避免使用:双重检查锁(Java 5 之前有缺陷,现在用 volatile 仍易出错)
💡 Spring 中替代:@Component 默认就是单例


🔹 2. 工厂方法模式(Factory Method)—— 创建对象的接口

适用场景:不同支付方式、不同日志输出、不同数据库驱动

/**
 * 支付方式接口(抽象产品)
 */
interface Payment {
    boolean pay(double amount);
}

/**
 * 微信支付实现类(具体产品)
 */
class WeChatPay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("📱 微信支付 " + amount + " 元成功");
        return true;
    }
}

/**
 * 支付宝支付实现类(具体产品)
 */
class Alipay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("💳 支付宝支付 " + amount + " 元成功");
        return true;
    }
}

/**
 * 工厂接口(创建者)
 */
interface PaymentFactory {
    Payment createPayment();
}

/**
 * 微信支付工厂(具体创建者)
 */
class WeChatPayFactory implements PaymentFactory {
    @Override
    public Payment createPayment() {
        return new WeChatPay();
    }
}

/**
 * 支付宝支付工厂(具体创建者)
 */
class AlipayFactory implements PaymentFactory {
    @Override
    public Payment createPayment() {
        return new Alipay();
    }
}

// 使用示例:客户端只依赖工厂接口
public class FactoryDemo {
    public static void main(String[] args) {
        // 根据配置动态选择工厂
        PaymentFactory factory = getPaymentFactory("alipay");

        // 创建支付对象,无需知道具体类型
        Payment payment = factory.createPayment();
        payment.pay(99.9); // 输出:💳 支付宝支付 99.9 元成功
    }

    // 模拟从配置文件读取
    private static PaymentFactory getPaymentFactory(String type) {
        switch (type) {
            case "wechat": return new WeChatPayFactory();
            case "alipay": return new AlipayFactory();
            default: throw new IllegalArgumentException("不支持的支付方式");
        }
    }
}

✅ Spring 中体现:ApplicationContext.getBean("xxx") 就是工厂方法
💡 进阶建议:用 Map<String, Supplier<Payment>> + Lambda 替代多个工厂类


🔹 3. 抽象工厂模式(Abstract Factory)—— 创建产品族

适用场景:多套 UI 主题、多数据库驱动 + 连接池组合

/**
 * 数据库连接接口(产品族1)
 */
interface Connection {
    void connect();
}

/**
 * MySQL 连接实现
 */
class MySQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 连接到 MySQL 数据库");
    }
}

/**
 * PostgreSQL 连接实现
 */
class PostgreSQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 连接到 PostgreSQL 数据库");
    }
}

/**
 * 数据库事务管理接口(产品族2)
 */
interface Transaction {
    void begin();
    void commit();
}

/**
 * MySQL 事务实现
 */
class MySQLTransaction implements Transaction {
    @Override
    public void begin() {
        System.out.println("🔄 MySQL 开始事务");
    }

    @Override
    public void commit() {
        System.out.println("✅ MySQL 提交事务");
    }
}

/**
 * PostgreSQL 事务实现
 */
class PostgreSQLTransaction implements Transaction {
    @Override
    public void begin() {
        System.out.println("🔄 PostgreSQL 开始事务");
    }

    @Override
    public void commit() {
        System.out.println("✅ PostgreSQL 提交事务");
    }
}

/**
 * 抽象工厂接口:创建一组相关对象
 */
interface DatabaseFactory {
    Connection createConnection();
    Transaction createTransaction();
}

/**
 * MySQL 工厂:创建 MySQL 产品族
 */
class MySQLFactory implements DatabaseFactory {
    @Override
    public Connection createConnection() {
        return new MySQLConnection();
    }

    @Override
    public Transaction createTransaction() {
        return new MySQLTransaction();
    }
}

/**
 * PostgreSQL 工厂:创建 PostgreSQL 产品族
 */
class PostgreSQLFactory implements DatabaseFactory {
    @Override
    public Connection createConnection() {
        return new PostgreSQLConnection();
    }

    @Override
    public Transaction createTransaction() {
        return new PostgreSQLTransaction();
    }
}

// 使用示例
public class AbstractFactoryDemo {
    public static void main(String[] args) {
        // 根据配置决定使用哪种数据库
        DatabaseFactory factory = getDatabaseFactory("mysql");

        // 客户端无需关心具体实现,只使用接口
        Connection conn = factory.createConnection();
        Transaction tx = factory.createTransaction();

        conn.connect();  // 🔌 连接到 MySQL 数据库
        tx.begin();      // 🔄 MySQL 开始事务
        tx.commit();     // ✅ MySQL 提交事务
    }

    private static DatabaseFactory getDatabaseFactory(String dbType) {
        return switch (dbType) {
            case "mysql" -> new MySQLFactory();
            case "postgresql" -> new PostgreSQLFactory();
            default -> throw new IllegalArgumentException("不支持的数据库");
        };
    }
}

✅ Spring 中体现:DataSource + JdbcTemplate 的组合就是抽象工厂
💡 实际应用:多租户系统中,不同租户使用不同数据库厂商


🔹 4. 建造者模式(Builder)—— 分步构建复杂对象

适用场景:构建 SQL、HTTP 请求、DTO、复杂配置对象

/**
 * 订单信息对象(复杂对象)
 */
public class Order {
    private String orderId;        // 订单ID
    private String customerId;     // 客户ID
    private String address;        // 收货地址
    private double totalAmount;    // 总金额
    private String paymentMethod;  // 支付方式
    private String note;           // 备注

    // 私有构造器,只能通过 Builder 创建
    private Order(Builder builder) {
        this.orderId = builder.orderId;
        this.customerId = builder.customerId;
        this.address = builder.address;
        this.totalAmount = builder.totalAmount;
        this.paymentMethod = builder.paymentMethod;
        this.note = builder.note;
    }

    // 静态内部类:建造者
    public static class Builder {
        private String orderId;
        private String customerId;
        private String address;
        private double totalAmount;
        private String paymentMethod;
        private String note;

        public Builder orderId(String orderId) {
            this.orderId = orderId;
            return this; // 返回 this,支持链式调用
        }

        public Builder customerId(String customerId) {
            this.customerId = customerId;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public Builder totalAmount(double totalAmount) {
            this.totalAmount = totalAmount;
            return this;
        }

        public Builder paymentMethod(String paymentMethod) {
            this.paymentMethod = paymentMethod;
            return this;
        }

        public Builder note(String note) {
            this.note = note;
            return this;
        }

        // 构建最终对象
        public Order build() {
            if (orderId == null || customerId == null || address == null) {
                throw new IllegalStateException("订单ID、客户ID、地址为必填项");
            }
            return new Order(this);
        }
    }

    // getter 方法(可选)
    @Override
    public String toString() {
        return "Order{" +
                "orderId='" + orderId + '\'' +
                ", customerId='" + customerId + '\'' +
                ", address='" + address + '\'' +
                ", totalAmount=" + totalAmount +
                ", paymentMethod='" + paymentMethod + '\'' +
                ", note='" + note + '\'' +
                '}';
    }
}

// 使用示例:链式构建,清晰易读
public class BuilderDemo {
    public static void main(String[] args) {
        Order order = new Order.Builder()
                .orderId("ORD20240501001")
                .customerId("CUST10086")
                .address("北京市朝阳区XX路1号")
                .totalAmount(299.9)
                .paymentMethod("支付宝")
                .note("请尽快发货,谢谢!")
                .build(); // 最后调用 build() 创建对象

        System.out.println(order);
        // 输出:
        // Order{orderId='ORD20240501001', customerId='CUST10086', address='北京市朝阳区XX路1号', totalAmount=299.9, paymentMethod='支付宝', note='请尽快发货,谢谢!'}
    }
}

✅ Java 标准库:StringBuilder、StringJoiner、java.time.LocalDateTime.Builder(Java 17+)
💡 Spring Boot 中体现:@ConfigurationProperties 自动绑定就是建造者思想


🔹 5. 适配器模式(Adapter)—— 接口转换

适用场景:接入第三方 SDK(微信、支付宝)、旧系统兼容

/**
 * 旧版支付接口(第三方系统)
 */
interface OldPaymentSystem {
    void doPay(String userId, double money);
}

/**
 * 旧版微信支付实现
 */
class WeChatOldSystem implements OldPaymentSystem {
    @Override
    public void doPay(String userId, double money) {
        System.out.println("【旧版】微信支付用户:" + userId + ",金额:" + money);
    }
}

/**
 * 新版统一支付接口(我们系统要使用的)
 */
interface NewPaymentService {
    boolean pay(String userId, double amount, String channel);
}

/**
 * 适配器:将旧接口适配为新接口
 */
class OldToNewAdapter implements NewPaymentService {
    private final OldPaymentSystem oldSystem; // 持有旧系统实例

    public OldToNewAdapter(OldPaymentSystem oldSystem) {
        this.oldSystem = oldSystem;
    }

    @Override
    public boolean pay(String userId, double amount, String channel) {
        // 适配:将新接口参数转换为旧接口参数
        if ("wechat".equals(channel)) {
            oldSystem.doPay(userId, amount);
            return true;
        }
        return false;
    }
}

// 使用示例
public class AdapterDemo {
    public static void main(String[] args) {
        // 假设我们接入了旧版微信支付系统
        OldPaymentSystem oldSystem = new WeChatOldSystem();

        // 用适配器包装,让旧系统能被新接口使用
        NewPaymentService paymentService = new OldToNewAdapter(oldSystem);

        // 现在所有支付都走新接口,无需修改业务逻辑
        boolean result = paymentService.pay("U1001", 199.9, "wechat");
        // 输出:【旧版】微信支付用户:U1001,金额:199.9
        System.out.println("支付结果:" + result);
    }
}

✅ Spring 中体现:org.springframework.web.client.RestTemplate 是对 HTTP 客户端的适配
💡 实际应用:公司从阿里云短信服务切换到腾讯云,只需写一个适配器,业务层无需改!


🔹 6. 装饰器模式(Decorator)—— 动态增强功能

适用场景:日志、缓存、权限、加密、限流等横切关注点

/**
 * 文件输出流接口(被装饰者)
 */
interface OutputStream {
    void write(String data);
}

/**
 * 真实的文件输出实现
 */
class FileOutputStream implements OutputStream {
    @Override
    public void write(String data) {
        System.out.println("💾 写入文件:" + data);
    }
}

/**
 * 装饰器基类:持有被装饰对象
 */
abstract class OutputStreamDecorator implements OutputStream {
    protected OutputStream target;

    public OutputStreamDecorator(OutputStream target) {
        this.target = target;
    }

    @Override
    public void write(String data) {
        target.write(data); // 默认行为
    }
}

/**
 * 日志装饰器:在写入前记录日志
 */
class LoggingDecorator extends OutputStreamDecorator {
    public LoggingDecorator(OutputStream target) {
        super(target);
    }

    @Override
    public void write(String data) {
        System.out.println("📝 记录日志:即将写入数据 → " + data);
        super.write(data); // 调用被装饰对象
    }
}

/**
 * 缓存装饰器:写入前先缓存
 */
class CacheDecorator extends OutputStreamDecorator {
    public CacheDecorator(OutputStream target) {
        super(target);
    }

    @Override
    public void write(String data) {
        System.out.println("⚡ 缓存数据:" + data);
        super.write(data);
    }
}

// 使用示例:动态组合多个装饰器
public class DecoratorDemo {
    public static void main(String[] args) {
        // 原始对象
        OutputStream fileStream = new FileOutputStream();

        // 一层层装饰:先加缓存,再加日志
        OutputStream decorated = new LoggingDecorator(new CacheDecorator(fileStream));

        // 调用一次,触发多个增强功能
        decorated.write("用户登录成功");

        // 输出:
        // ⚡ 缓存数据:用户登录成功
        // 📝 记录日志:即将写入数据 → 用户登录成功
        // 💾 写入文件:用户登录成功
    }
}

✅ Java 标准库:BufferedInputStream、DataInputStream、PrintStream 都是装饰器
✅ Spring AOP 就是装饰器模式的高级实现
💡 实际应用:在 Controller 层加 @Cacheable、@Log、@RateLimit 就是装饰器思想


🔹 7. 代理模式(Proxy)—— 控制访问

适用场景:AOP、远程调用、懒加载、权限控制

/**
 * 用户服务接口
 */
interface UserService {
    void getUserInfo(String userId);
    void updateUser(String userId, String name);
}

/**
 * 真实实现
 */
class UserServiceImpl implements UserService {
    @Override
    public void getUserInfo(String userId) {
        System.out.println("🔍 查询用户信息:ID=" + userId);
    }

    @Override
    public void updateUser(String userId, String name) {
        System.out.println("✏️ 更新用户信息:ID=" + userId + ", 新姓名=" + name);
    }
}

/**
 * 代理类:控制对真实对象的访问
 */
class UserServiceProxy implements UserService {
    private UserService realService; // 真实对象

    public UserServiceProxy() {
        this.realService = new UserServiceImpl(); // 懒加载
    }

    @Override
    public void getUserInfo(String userId) {
        // 增强:权限检查
        if (!hasPermission(userId)) {
            System.out.println("🚫 权限不足,无法查询用户信息");
            return;
        }
        System.out.println("🔐 代理:在查询前做权限校验");
        realService.getUserInfo(userId); // 调用真实对象
    }

    @Override
    public void updateUser(String userId, String name) {
        // 增强:日志记录
        System.out.println("📝 代理:记录更新操作,用户=" + userId);
        realService.updateUser(userId, name);
    }

    // 模拟权限检查
    private boolean hasPermission(String userId) {
        return "admin".equals(userId) || "U1001".equals(userId);
    }
}

// 使用示例
public class ProxyDemo {
    public static void main(String[] args) {
        UserService proxy = new UserServiceProxy();

        // 正常用户
        proxy.getUserInfo("U1001"); // ✅ 通过
        // 输出:
        // 🔐 代理:在查询前做权限校验
        // 🔍 查询用户信息:ID=U1001

        // 非法用户
        proxy.getUserInfo("guest"); // ❌ 拒绝
        // 输出:
        // 🚫 权限不足,无法查询用户信息

        // 更新操作
        proxy.updateUser("U1001", "张三");
        // 输出:
        // 📝 代理:记录更新操作,用户=U1001
        // ✏️ 更新用户信息:ID=U1001, 新姓名=张三
    }
}

✅ Spring AOP 就是动态代理的实现(JDK Proxy / CGLIB)
💡 实际应用:@Transactional、@Cacheable、@PreAuthorize 都是代理增强


🔹 8. 外观模式(Facade)—— 统一复杂子系统接口

适用场景:微服务调用多个内部服务、封装复杂 API

/**
 * 子系统1:订单服务
 */
class OrderService {
    public void createOrder(String userId) {
        System.out.println("📦 创建订单,用户:" + userId);
    }
}

/**
 * 子系统2:库存服务
 */
class InventoryService {
    public boolean checkStock(String productId) {
        System.out.println("📊 检查商品库存,商品ID:" + productId);
        return true;
    }

    public void deductStock(String productId) {
        System.out.println("📉 扣减库存,商品ID:" + productId);
    }
}

/**
 * 子系统3:支付服务
 */
class PaymentService {
    public boolean pay(String orderId, double amount) {
        System.out.println("💳 支付订单,订单ID:" + orderId + ",金额:" + amount);
        return true;
    }
}

/**
 * 外观类:为复杂子系统提供统一入口
 */
class OrderFacade {
    private OrderService orderService = new OrderService();
    private InventoryService inventoryService = new InventoryService();
    private PaymentService paymentService = new PaymentService();

    // 一键下单:封装复杂流程
    public void placeOrder(String userId, String productId, double amount) {
        System.out.println("🚀 开始下单流程...");

        // 1. 检查库存
        if (!inventoryService.checkStock(productId)) {
            System.out.println("❌ 库存不足,下单失败");
            return;
        }

        // 2. 创建订单
        orderService.createOrder(userId);

        // 3. 扣库存
        inventoryService.deductStock(productId);

        // 4. 支付
        if (paymentService.pay("ORD" + System.currentTimeMillis(), amount)) {
            System.out.println("🎉 下单成功!");
        } else {
            System.out.println("❌ 支付失败,订单已取消");
        }
    }
}

// 使用示例
public class FacadeDemo {
    public static void main(String[] args) {
        // 客户端只需调用一个接口,无需关心内部细节
        OrderFacade facade = new OrderFacade();
        facade.placeOrder("U1001", "P001", 199.9);

        // 输出:
        // 🚀 开始下单流程...
        // 📊 检查商品库存,商品ID:P001
        // 📦 创建订单,用户:U1001
        // 📉 扣减库存,商品ID:P001
        // 💳 支付订单,订单ID:ORD1717000000000,金额:199.9
        // 🎉 下单成功!
    }
}

✅ Spring 中体现:RestTemplate、FeignClient 就是外观模式
💡 实际应用:封装“用户注册”流程(调用短信、邮箱、用户中心、积分系统)


🔹 9. 策略模式(Strategy)—— 算法可互换

适用场景:支付方式、折扣规则、排序策略、路由算法

/**
 * 折扣策略接口
 */
interface DiscountStrategy {
    double calculate(double originalPrice);
}

/**
 * 无折扣策略
 */
class NoDiscount implements DiscountStrategy {
    @Override
    public double calculate(double originalPrice) {
        return originalPrice; // 不打折
    }
}

/**
 * 8折优惠策略
 */
class EightyPercentDiscount implements DiscountStrategy {
    @Override
    public double calculate(double originalPrice) {
        return originalPrice * 0.8;
    }
}

/**
 * 满减策略:满100减20
 */
class FullReductionDiscount implements DiscountStrategy {
    private final double fullAmount;
    private final double reduceAmount;

    public FullReductionDiscount(double fullAmount, double reduceAmount) {
        this.fullAmount = fullAmount;
        this.reduceAmount = reduceAmount;
    }

    @Override
    public double calculate(double originalPrice) {
        if (originalPrice >= fullAmount) {
            return originalPrice - reduceAmount;
        }
        return originalPrice;
    }
}

/**
 * 折扣计算器(上下文)
 */
class DiscountCalculator {
    private DiscountStrategy strategy; // 策略对象

    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public double calculate(double price) {
        if (strategy == null) {
            throw new IllegalStateException("请先设置折扣策略");
        }
        return strategy.calculate(price);
    }
}

// 使用示例:动态切换策略
public class StrategyDemo {
    public static void main(String[] args) {
        DiscountCalculator calc = new DiscountCalculator();

        // 场景1:会员8折
        calc.setStrategy(new EightyPercentDiscount());
        System.out.println("会员价:" + calc.calculate(100)); // 输出:80.0

        // 场景2:满100减20
        calc.setStrategy(new FullReductionDiscount(100, 20));
        System.out.println("满减价:" + calc.calculate(120)); // 输出:100.0

        // 场景3:普通用户
        calc.setStrategy(new NoDiscount());
        System.out.println("原价:" + calc.calculate(80)); // 输出:80.0
    }
}

✅ Spring 中体现:Comparator、TaskExecutor、MessageConverter
💡 进阶建议:用 Map<String, DiscountStrategy> + 注解 + Spring 容器自动注入,实现热插拔!


🔹 10. 模板方法模式(Template Method)—— 固定流程,灵活步骤

适用场景:订单处理、审核流程、数据导入导出

/**
 * 抽象订单处理流程(模板方法)
 */
abstract class OrderProcessTemplate {
    // 模板方法:定义算法骨架,子类重写具体步骤
    public final void processOrder(String orderId) {
        System.out.println("📦 开始处理订单:" + orderId);
        validateOrder(orderId);      // 步骤1:校验
        calculateTotal(orderId);     // 步骤2:计算金额
        applyDiscount(orderId);      // 步骤3:应用折扣(子类实现)
        saveOrder(orderId);          // 步骤4:保存
        notifyUser(orderId);         // 步骤5:通知
        System.out.println("✅ 订单处理完成\n");
    }

    // 具体方法:所有子类共享
    protected void validateOrder(String orderId) {
        System.out.println("🔧 步骤1:校验订单是否存在");
    }

    protected void calculateTotal(String orderId) {
        System.out.println("💰 步骤2:计算订单总金额");
    }

    // 抽象方法:子类必须实现
    protected abstract void applyDiscount(String orderId);

    protected void saveOrder(String orderId) {
        System.out.println("💾 步骤4:保存订单到数据库");
    }

    protected void notifyUser(String orderId) {
        System.out.println("📢 步骤5:发送短信通知用户");
    }
}

/**
 * 普通订单处理流程
 */
class RegularOrderProcess extends OrderProcessTemplate {
    @Override
    protected void applyDiscount(String orderId) {
        System.out.println("📉 步骤3:普通订单无折扣");
    }
}

/**
 * VIP订单处理流程
 */
class VIPOrderProcess extends OrderProcessTemplate {
    @Override
    protected void applyDiscount(String orderId) {
        System.out.println("🎁 步骤3:VIP订单享受9折优惠");
    }
}

// 使用示例
public class TemplateDemo {
    public static void main(String[] args) {
        OrderProcessTemplate regular = new RegularOrderProcess();
        OrderProcessTemplate vip = new VIPOrderProcess();

        regular.processOrder("ORD001");
        // 输出:
        // 📦 开始处理订单:ORD001
        // 🔧 步骤1:校验订单是否存在
        // 💰 步骤2:计算订单总金额
        // 📉 步骤3:普通订单无折扣
        // 💾 步骤4:保存订单到数据库
        // 📢 步骤5:发送短信通知用户
        // ✅ 订单处理完成

        vip.processOrder("ORD002");
        // 输出:
        // 📦 开始处理订单:ORD002
        // 🔧 步骤1:校验订单是否存在
        // 💰 步骤2:计算订单总金额
        // 🎁 步骤3:VIP订单享受9折优惠
        // 💾 步骤4:保存订单到数据库
        // 📢 步骤5:发送短信通知用户
        // ✅ 订单处理完成
    }
}

✅ Spring 中体现:JdbcTemplate、AbstractRoutingDataSource
💡 实际应用:所有“审核流程”、“导入流程”、“数据清洗流程”都可用模板方法


🔹 11. 观察者模式(Observer)—— 事件驱动,解耦发布与订阅

适用场景:订单创建后发短信、发邮件、记日志、更新缓存

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者接口
 */
interface OrderObserver {
    void onOrderCreated(String orderId);
}

/**
 * 发短信观察者
 */
class SmsObserver implements OrderObserver {
    @Override
    public void onOrderCreated(String orderId) {
        System.out.println("📱 发送短信:订单 " + orderId + " 创建成功");
    }
}

/**
 * 发邮件观察者
 */
class EmailObserver implements OrderObserver {
    @Override
    public void onOrderCreated(String orderId) {
        System.out.println("📧 发送邮件:订单 " + orderId + " 创建成功");
    }
}

/**
 * 记录日志观察者
 */
class LogObserver implements OrderObserver {
    @Override
    public void onOrderCreated(String orderId) {
        System.out.println("📝 记录日志:订单 " + orderId + " 已创建");
    }
}

/**
 * 订单发布者(被观察者)
 */
class OrderPublisher {
    private List<OrderObserver> observers = new ArrayList<>();

    // 注册观察者
    public void addObserver(OrderObserver observer) {
        observers.add(observer);
    }

    // 移除观察者
    public void removeObserver(OrderObserver observer) {
        observers.remove(observer);
    }

    // 通知所有观察者
    public void notifyObservers(String orderId) {
        System.out.println("🔔 订单创建事件触发,通知所有观察者...");
        for (OrderObserver observer : observers) {
            observer.onOrderCreated(orderId);
        }
    }

    // 创建订单(触发事件)
    public void createOrder(String orderId) {
        System.out.println("🛒 创建订单:" + orderId);
        notifyObservers(orderId); // 通知所有观察者
    }
}

// 使用示例
public class ObserverDemo {
    public static void main(String[] args) {
        OrderPublisher publisher = new OrderPublisher();

        // 注册多个观察者
        publisher.addObserver(new SmsObserver());
        publisher.addObserver(new EmailObserver());
        publisher.addObserver(new LogObserver());

        // 创建订单,自动触发通知
        publisher.createOrder("ORD20240501");

        // 输出:
        // 🛒 创建订单:ORD20240501
        // 🔔 订单创建事件触发,通知所有观察者...
        // 📱 发送短信:订单 ORD20240501 创建成功
        // 📧 发送邮件:订单 ORD20240501 创建成功
        // 📝 记录日志:订单 ORD20240501 已创建
    }
}

✅ Spring 中体现:ApplicationEventPublisher + @EventListener
💡 实际应用:Spring Boot 中 @EventListener(OrderCreatedEvent.class) 就是观察者模式


🔹 12. 责任链模式(Chain of Responsibility)—— 多级处理,逐级传递

适用场景:权限校验、风控过滤、日志拦截、API 网关

/**
 * 处理器接口
 */
interface RequestHandler {
    void handle(String request);
    void setNext(RequestHandler next); // 设置下一个处理器
}

/**
 * 权限校验处理器
 */
class AuthHandler implements RequestHandler {
    private RequestHandler next;

    @Override
    public void handle(String request) {
        System.out.println("🔒 权限校验:检查用户是否登录");
        if (request.contains("admin")) {
            System.out.println("✅ 权限通过");
            if (next != null) next.handle(request); // 传递给下一个
        } else {
            System.out.println("❌ 权限不足,拒绝请求");
        }
    }

    @Override
    public void setNext(RequestHandler next) {
        this.next = next;
    }
}

/**
 * 黑名单过滤处理器
 */
class BlacklistHandler implements RequestHandler {
    private RequestHandler next;

    @Override
    public void handle(String request) {
        System.out.println("⛔ 黑名单检查:检查IP是否被封禁");
        if (!request.contains("blocked")) {
            System.out.println("✅ 未在黑名单");
            if (next != null) next.handle(request);
        } else {
            System.out.println("🚫 请求被拦截,来自黑名单IP");
        }
    }

    @Override
    public void setNext(RequestHandler next) {
        this.next = next;
    }
}

/**
 * 日志记录处理器
 */
class LogHandler implements RequestHandler {
    private RequestHandler next;

    @Override
    public void handle(String request) {
        System.out.println("📝 记录请求日志:" + request);
        if (next != null) next.handle(request);
    }

    @Override
    public void setNext(RequestHandler next) {
        this.next = next;
    }
}

// 使用示例:构建责任链
public class ChainDemo {
    public static void main(String[] args) {
        // 构建责任链:权限 → 黑名单 → 日志
        RequestHandler auth = new AuthHandler();
        RequestHandler blacklist = new BlacklistHandler();
        RequestHandler log = new LogHandler();

        auth.setNext(blacklist);
        blacklist.setNext(log);

        // 模拟请求
        auth.handle("admin:query"); // 权限通过 → 黑名单通过 → 日志记录
        // 输出:
        // 🔒 权限校验:检查用户是否登录
        // ✅ 权限通过
        // ⛔ 黑名单检查:检查IP是否被封禁
        // ✅ 未在黑名单
        // 📝 记录请求日志:admin:query

        System.out.println("\n--- 另一个请求 ---\n");

        auth.handle("blocked:delete"); // 权限通过 → 黑名单拦截 → 停止
        // 输出:
        // 🔒 权限校验:检查用户是否登录
        // ✅ 权限通过
        // ⛔ 黑名单检查:检查IP是否被封禁
        // 🚫 请求被拦截,来自黑名单IP
    }
}

✅ Spring 中体现:Filter、Interceptor、GatewayFilter
💡 实际应用:Spring Security 的 FilterChain、API 网关的鉴权链


🔹 13. 命令模式(Command)—— 将请求封装为对象

适用场景:操作回滚、异步任务、MQ 消息、宏命令

/**
 * 命令接口
 */
interface Command {
    void execute(); // 执行
    void undo();    // 撤销
}

/**
 * 发送短信命令
 */
class SendSmsCommand implements Command {
    private String phone;
    private String message;

    public SendSmsCommand(String phone, String message) {
        this.phone = phone;
        this.message = message;
    }

    @Override
    public void execute() {
        System.out.println("📱 发送短信到 " + phone + ": " + message);
    }

    @Override
    public void undo() {
        System.out.println("❌ 撤销短信发送: " + message);
    }
}

/**
 * 扣减库存命令
 */
class DeductInventoryCommand implements Command {
    private String productId;
    private int quantity;

    public DeductInventoryCommand(String productId, int quantity) {
        this.productId = productId;
        this.quantity = quantity;
    }

    @Override
    public void execute() {
        System.out.println("📉 扣减库存:商品 " + productId + ",数量 " + quantity);
    }

    @Override
    public void undo() {
        System.out.println("📈 恢复库存:商品 " + productId + ",数量 " + quantity);
    }
}

/**
 * 命令执行器(Invoker)
 */
class CommandExecutor {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void execute() {
        if (command != null) {
            command.execute();
        }
    }

    public void undo() {
        if (command != null) {
            command.undo();
        }
    }
}

// 使用示例
public class CommandDemo {
    public static void main(String[] args) {
        CommandExecutor executor = new CommandExecutor();

        // 创建命令
        Command smsCmd = new SendSmsCommand("13800138000", "您的订单已创建");
        Command inventoryCmd = new DeductInventoryCommand("P001", 2);

        // 执行命令
        executor.setCommand(smsCmd);
        executor.execute(); // 📱 发送短信...
        executor.undo();    // ❌ 撤销...

        System.out.println("---");

        // 执行库存扣减
        executor.setCommand(inventoryCmd);
        executor.execute(); // 📉 扣减库存...
        executor.undo();    // 📈 恢复库存...
    }
}

✅ Spring 中体现:@Async、@RabbitListener、Runnable
💡 实际应用:MQ 消息消费就是“命令模式”:消息 = 命令,消费者 = 执行器


🔹 14. 状态模式(State)—— 对象行为随状态改变

适用场景:订单状态、合同状态、流程审批、游戏状态机

/**
 * 订单状态接口
 */
interface OrderState {
    void next(OrderContext context); // 下一状态
    void prev(OrderContext context); // 上一状态
    String getStatusName();
}

/**
 * 待支付状态
 */
class PendingPaymentState implements OrderState {
    @Override
    public void next(OrderContext context) {
        System.out.println("✅ 支付成功,订单进入【已支付】状态");
        context.setState(new PaidState());
    }

    @Override
    public void prev(OrderContext context) {
        System.out.println("❌ 无法退回上一状态");
    }

    @Override
    public String getStatusName() {
        return "待支付";
    }
}

/**
 * 已支付状态
 */
class PaidState implements OrderState {
    @Override
    public void next(OrderContext context) {
        System.out.println("✅ 订单进入【已发货】状态");
        context.setState(new ShippedState());
    }

    @Override
    public void prev(OrderContext context) {
        System.out.println("🔙 订单退回【待支付】状态");
        context.setState(new PendingPaymentState());
    }

    @Override
    public String getStatusName() {
        return "已支付";
    }
}

/**
 * 已发货状态
 */
class ShippedState implements OrderState {
    @Override
    public void next(OrderContext context) {
        System.out.println("✅ 订单进入【已完成】状态");
        context.setState(new CompletedState());
    }

    @Override
    public void prev(OrderContext context) {
        System.out.println("🔙 订单退回【已支付】状态");
        context.setState(new PaidState());
    }

    @Override
    public String getStatusName() {
        return "已发货";
    }
}

/**
 * 已完成状态
 */
class CompletedState implements OrderState {
    @Override
    public void next(OrderContext context) {
        System.out.println("❌ 订单已完成,无法继续流转");
    }

    @Override
    public void prev(OrderContext context) {
        System.out.println("🔙 订单退回【已发货】状态");
        context.setState(new ShippedState());
    }

    @Override
    public String getStatusName() {
        return "已完成";
    }
}

/**
 * 订单上下文(持有当前状态)
 */
class OrderContext {
    private OrderState state;

    public OrderContext() {
        this.state = new PendingPaymentState(); // 初始状态
    }

    public void setState(OrderState state) {
        this.state = state;
        System.out.println("🔄 当前状态变更为:" + state.getStatusName());
    }

    public void next() {
        state.next(this);
    }

    public void prev() {
        state.prev(this);
    }

    public String getCurrentState() {
        return state.getStatusName();
    }
}

// 使用示例
public class StateDemo {
    public static void main(String[] args) {
        OrderContext order = new OrderContext();
        System.out.println("初始状态:" + order.getCurrentState());

        order.next(); // 待支付 → 已支付
        order.next(); // 已支付 → 已发货
        order.next(); // 已发货 → 已完成
        order.next(); // 无法继续

        System.out.println("---");

        order.prev(); // 已完成 → 已发货
        order.prev(); // 已发货 → 已支付
        order.prev(); // 已支付 → 待支付
    }
}

✅ Spring 中体现:Spring StateMachine
💡 实际应用:订单系统、合同系统、审批流(如钉钉审批)


🔹 15. 外观模式(Facade)—— 已在第8节详解,不再重复

✅ 补充说明:在微服务架构中,网关(Gateway) 就是典型的外观模式!


✅ 三、总结:后端开发者必掌握的15种设计模式速查表

模式类型是否必须掌握实际应用场景代码难度
单例创建型✅连接池、配置中心⭐
工厂方法创建型✅支付方式、日志输出⭐⭐
抽象工厂创建型✅多数据库组合⭐⭐⭐
建造者创建型✅构建复杂对象(SQL/DTO)⭐⭐
适配器结构型✅第三方SDK兼容⭐⭐
装饰器结构型✅日志、缓存、AOP⭐⭐⭐
代理结构型✅Spring AOP、远程调用⭐⭐⭐
外观结构型✅微服务封装、统一接口⭐⭐
策略行为型✅支付、折扣、排序⭐⭐
模板方法行为型✅订单流程、审核流程⭐⭐
观察者行为型✅事件通知、异步解耦⭐⭐⭐
责任链行为型✅权限校验、风控过滤⭐⭐⭐
命令行为型✅操作回滚、MQ 消息⭐⭐⭐
状态行为型✅订单状态、审批流⭐⭐⭐
原型创建型⚠️了解即可⭐

🚀 建议学习顺序:
单例 → 工厂 → 策略 → 模板 → 装饰器 → 代理 → 观察者 → 责任链 → 命令 → 状态


✅ 四、实战建议:如何在项目中落地?

阶段行动建议
🚀 第1周在你的 Spring Boot 项目中,把 if-else 支付方式判断,重构为策略模式
🚀 第2周把日志打印、权限校验、限流逻辑,用装饰器或AOP封装
🚀 第3周用模板方法重构一个“订单创建流程”
🚀 第4周用观察者实现“订单创建后发短信”
🚀 第5周用状态模式实现“订单状态流转”

✅ 终极目标:让你的代码可读、可扩展、可测试、易维护!


📎 附录:完整代码包获取建议

所有示例代码均已可运行,建议你:

  1. 在 IDEA 中新建一个 Maven 项目
  2. 将以上每个模式的代码放入独立类中
  3. 用 main() 方法运行测试
  4. 每学一个模式,写一篇笔记,发到团队知识库!

💬 最后寄语

设计模式不是为了“炫技”,而是为了“少改代码”。
你今天用一个策略模式,明天就不必改 10 个 if-else。
你今天用一个观察者,明天加个通知功能,无需动核心逻辑。

真正的高手,不是写得多,而是改得少。

2024自动化测试新选择:Playwright核心优势与实战入门指南 自动化测试是保障软件质量、提升交付效率的关键工程实践。其核心原理是通过脚本模拟用户操作,对软件功能进行验证,旨在实现快速、准确、可重复的回归测试。随着Web应用日益复杂,传统工具在稳定性、对现代Web技术的支持以及维护成本上面临挑战。Playwright作为新一代浏览器自动化库,通过其与浏览器内核深度集成的架构革新,从根本上解决了测试不稳定的痛点,提供了开箱即用的智能等待、跨浏览器一致性以及对单页应用(SPA)的完美支持,技术价值在于显著提升了端到端测试的可靠性和开发体验。其应用场景广泛覆盖Web应用的UI 阅读详情

相关推荐

C++20协程实战指南:从网络库到移动端与多媒体开发

协程是一种用户态的轻量级线程,它允许程序在单线程内通过挂起与恢复实现并发,其核心原理在于保存和恢复执行上下文,避免了传统多线程的上下文切换开销。这项技术为高并发编程带来了显著的性能提升和代码简化价值,尤其适用于需要处理大量I/O操作的场景,如网络服务器、游戏引擎和实时数据处理。在C++20标准中,协程通过co_await、co_return等关键字提供了语言级的原生支持,使得开发者能够以同步的编码风格编写高性能的异步程序。本文将深入探讨如何基于C++20协程构建异步架构,并分享其在网络编程、移动端集成以及多

chuanjiaoye5017的博客 437

java后台开发入门(springboot快速入门)

带领大家借助当下比较流行的springboot框架快速开发属于自己的java后台。即便你是编程小白,没有任何编程基础也可以学习本课程。知识点1,Java2,springboot3,freemarker4,bootstrap4.35,Javaweb6,微信小程序同时会借助当下最热门的微信小程序来作为我们的前端展示。所以课程中也会教给大家一部分小程序开发的知识。大家只需要跟着老师一步步学习,我们既可以学习到java知识,也可以学习到小程序开发和web开发相关的知识。我们学习过程中会有老师在线实时解答,每节课都会有对应的源码和配套笔记给到大家。

AI大模型应用开发:从概念到工程的系统性学习与实践指南

AI大模型应用开发的核心在于将通用人工智能能力工程化地融入具体业务场景,这远不止于简单的API调用。其技术原理涉及提示工程、检索增强生成(RAG)、模型微调及智能体(Agent)架构,旨在解决模型的知识实时性、可控性与业务适配性问题。从技术价值看,它连接了前沿AI潜力与产业落地需求,催生了“AI全栈工程师”这一复合型角色。在实际应用场景中,开发者需构建包含数据处理、向量检索、服务部署、成本与性能优化的完整技术栈,以应对生产环境的稳定性、延迟与安全挑战。本文聚焦于如何系统性地掌握这一领域,提供了从认知体验到实

weixin_30564901的博客 410

Java 入门(完整教程)

1991 年,美国的 Sun 公司为了开发智能家电等嵌入式设备的控制系统,由詹姆斯・高斯林(James Gosling)领导的 Green 计划 团队开始了一种新语言的研发。最初该语言被命名为 Oak(橡树),它是基于 C++ 开发的,吸收了 C++ 的优点并做出来扩展,同时摒弃了 C++ 中的一些复杂概念,使得 Java 功能强大的同时又易于理解和使用。

野生派蒙的博客 2万+

Java学习笔记2.1.1 Java基本语法 - Java代码基本格式

Java基本语法格式;Java语句分类;Java大小写敏感;建议采用缩进格式书写代码

howard2005的专栏 3676

授人以鱼不如授人以渔 (第409篇文章)

一 引言一 引言本文章内容。

qq_56248592的博客 1136

Java基础---JAVA基本数据类型,关键字

JAVA的关键字: 1.基本数据类型 2.类、方法和变量修饰符关键字 3.访问修饰符关键字 4.流程控制关键字 5. 错误处理 6. 包相关 7. 变量引用 8. 保留字

War3cdota的博客 4449

JAVA 设计模式手册

java设计模式手册,对于初学java的人对设计模式有一定了解。

【Java从入门到精通】Java变量命名规则

在 Java 中,不同类型的变量(例如实例变量、局部变量、静态变量等)有一些命名规则和约定。遵循一些基本规则,这有助于提高代码的可读性和维护性。变量名应该具有清晰的含义,能够准确地反映变量的用途。避免使用单个字符或无意义的缩写。在变量名中使用驼峰命名法,即将每个单词的首字母大写,除了第一个单词外,其余单词的首字母都采用大写形式。。不要使用 Java 关键字(例如,class、int、boolean等)作为变量名。Java 是大小写敏感的,因此变量名中的大小写字母被视为不同的符号。例如,

RL2698853114的博客 807

设计模式——Java手册.pdf

设计模式——Java手册.pdf

在Rviz仿真环境中搭建传送带

<geometry><material>

qq_58268456的博客 934

如何提升 Java 开发能力?

并发编程:synchronized 底层原理、volatile 可见性与有序性、ThreadPoolExecutor 线程池设计、CompletableFuture 异步编程。集合框架:HashMap 红黑树优化、ConcurrentHashMap 分段锁与 CAS 实现、CopyOnWriteArrayList 适用场景。要系统提升 Java 开发能力,需从 基础巩固、技术拓展、实战经验、持续学习 四个维度入手。JVM 原理:类加载机制、内存模型(堆/栈/方法区)、垃圾回收算法(CMS、G1、ZGC)。

qq_44688715的博客 1306

【Benchmark 性能测试全指南:从核心原理到 CINEBENCH 实战解析】

本文深度拆解基准测试(Benchmark)的底层逻辑,详解数据集、工作负载、度量指标三大核心要素,分步演示测试流程与统计分析要点。结合 CINEBENCH R23 实战案例,揭秘 CPU 性能评估方法论,助你掌握系统性能量化与优化的核心技能。

rong_ha_ha的博客 6327

大白话说Java设计模式-01-开篇总览(附50篇学习路线图)

本文是大白话说Java设计模式系列的开篇总览,系统梳理23种经典设计模式的分类、核心思想与适用场景,提供完整的50篇学习路线图,讲解设计模式的学习方法、落地原则与避坑指南,帮助开发者建立设计模式的全局知识体系,掌握如何在业务实战中灵活运用设计模式提升代码质量。

Java后端 | AI智能体应用实战派 | 电脑技能行家 599

别再只用固定线了!聊聊Android车机‘快速倒车’与‘正常倒车’的UI与数据流核心差异(附动态轨迹线实现原理)

本文深度解析Android车机中快速倒车与正常倒车的核心差异,探讨从内核级视频流水线到动态轨迹线的技术实现。快速倒车通过内核直接操作FrameBuffer实现2秒内响应,而正常倒车则支持多传感器数据融合与动态UI元素。文章还分享了动态轨迹线的算法实现与性能优化技巧,帮助开发者打造极致的倒车体验。

weixin_42550597的博客 253

STM32F407VET6与CH395Q串口通信实战:从零搭建以太网客户端(附完整代码)

本文详细介绍了基于STM32F407VET6微控制器与南京沁恒微CH395Q以太网芯片,通过串口通信从零搭建TCP客户端应用的完整实战过程。内容涵盖硬件连接、驱动层设计、基于FreeRTOS的任务实现以及核心调试技巧,并提供了完整的代码示例,帮助嵌入式开发者快速实现设备联网功能。

weixin_29179311的博客 413

配套 Java 全路线分阶段书籍清单(对应前面「零基础→企业后端开发」路线)

按学习顺序划分,标注,区分入门实战、原理深挖、面试必看三类。

qq_58966605的博客 261

OPC UA 协议详解

OPC UA(统一架构)是新一代工业自动化标准通信协议,替代传统OPC Classic,具有跨平台、高安全性、标准化等优势。基于TCP协议,支持全平台部署,采用面向对象架构组织数据,提供实时读写、事件订阅、历史数据访问等功能。作为工业4.0核心协议,适用于智能制造、数字孪生等场景,能实现多品牌设备统一接入。相比Modbus和MQTT,OPC UA协议更规范安全但复杂度较高,是大型工业集群互联的主流选择。

eastyuxiao的专栏 723

Java程序员书籍推荐:这些书你看过几本?,Java多线程面试题大全含答案

4、微服务那些事儿 5、《Java Web开发详解–XML+XSLT+Servlet+JSP深入剖析与实例应用》 6、分布式 Java 应用:基础与实践 7、Effective Java中文版 8、MySQL5.6从开零始学 1、深入理解Java虚拟机 Java虚拟机是必学的一门技术。作者是周志明,这本书可以说是国内写得最好的有关Java虚 拟机的书籍, 另外值得一提的是,《深入理解Java虚拟机:JVM高级特性与最佳实践》这本 书,有电子版的,网上搜一下就能下载到了。不过建议有兴趣的朋友还是去买书看,电

m0_64384350的博客 329

直流电源滤波电路的设计与优化:从基础原理到高效应用

本文深入探讨直流电源滤波电路的设计与优化,从基础原理到高效应用全面解析。重点介绍电容滤波和电感滤波的工作原理及实战设计要点,分享复合滤波电路的进阶技巧,并提供常见问题排查指南。文章还涵盖现代滤波技术的新发展,如有源滤波和数字控制滤波的应用,帮助工程师提升电源系统的稳定性和效率。

weixin_29255731的博客 175

基于3D相机的人体穴位识别与标注系统——完整Python实现方案

摘要 本文提出了一种基于3D相机的人体穴位识别与标注系统完整实现方案。系统采用Intel RealSense D435相机实时采集RGB-D数据,结合MediaPipe Pose模型进行人体33个关键骨骼点的三维姿态估计。通过建立穴位与骨骼关键点的映射关系,利用相机内参和深度信息将二维图像坐标转换为三维空间坐标。系统采用模块化设计,包含数据采集层、算法处理层、坐标转换层和可视化层,实现了穴位定位、三维坐标转换和点云可视化功能。关键技术包括:基于骨度折量法的穴位映射算法、深度图像到三维点云的转换方法,以及Op

AI的内部世界的博客 268

java从入门到进阶书单推荐必收藏

java从入门到进阶书单推荐必收藏

xuefei0619的博客 239

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 378

给求职者的建议:软件工程师

软件工程师的核心竞争力=扎实的底层基础+工程化思维+持续学习能力。建议制定6个月学习计划,前3个月打基础,后3个月做综合项目(如电商系统),逐步迭代技术深度。

qq_63532539的博客 1427

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++程序员进阶指南:从语言精通到垂直领域专家的五大高价值方向

在软件工程领域,编程语言是构建数字世界的基石,而C++以其对系统资源的极致掌控和底层硬件的高效访问能力,成为高性能计算、基础设施和实时系统等关键领域的核心技术。其核心原理在于通过直接内存操作、零成本抽象和编译期优化,实现对计算性能的深度挖掘。这一技术价值体现在能够构建操作系统、数据库、游戏引擎、嵌入式系统等高壁垒、高复杂度的核心系统。从应用场景来看,现代C++技术栈已深度融入基础设施研发、音视频处理、物联网、游戏开发及编译器工具链等垂直领域。例如,在基础设施方向,开发者需精通内存管理、无锁数据结构和网络编程

weixin_34293141的博客 639

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Java基础 | 20】多线程基础详解:线程创建、线程安全、synchronized 与线程池入门

本文面向已经掌握 Java 类、对象、集合和异常处理的读者,系统梳理 Java 多线程基础:进程与线程、并发与并行、线程创建方式、线程生命周期、共享数据带来的线程安全问题,以及 synchronized、Lock、BlockingQueue 和线程池的入门用法。通过卖票、死锁、生产者消费者等示例,帮助读者建立 Java 并发编程的第一层知识框架。

超级苦力怕的博客 3887
上一篇: 2、Java 设计模式避坑与演进思维
下一篇: 1、Spring Cloud Stream 官方函数式编程模型完全指南
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值