SpringBoot 中常见的设计模式

server/2024/11/19 9:18:34/

在 Spring Boot 中,很多设计模式是通过 Spring 框架本身来实现的,但我们也可以在实际开发过程中看到多种设计模式的应用。以下是几个常见的设计模式及其在 Spring Boot 中的应用实例:

1. 单例模式 (Singleton Pattern)

在 Spring 中,大多数 Bean 默认采用单例模式,即整个应用上下文中只有一个实例。

示例:
@Service
public class MyService {public String getMessage() {return "Hello, Spring Boot!";}
}

在 Spring Boot 中,@Service 注解标记的 MyService 类是一个单例 Bean,意味着无论我们调用多少次,Spring 只会创建一个 MyService 实例并注入。

@RestController
public class MyController {@Autowiredprivate MyService myService;@GetMapping("/message")public String getMessage() {return myService.getMessage();}
}

2. 工厂模式 (Factory Pattern)

Spring Boot 中经常使用工厂模式来创建对象,尤其是在创建复杂的对象或者需要根据条件选择不同类型的对象时。

示例:
public interface Vehicle {void drive();
}public class Car implements Vehicle {@Overridepublic void drive() {System.out.println("Driving a car...");}
}public class Bike implements Vehicle {@Overridepublic void drive() {System.out.println("Riding a bike...");}
}@Component
public class VehicleFactory {public Vehicle getVehicle(String vehicleType) {if (vehicleType.equalsIgnoreCase("car")) {return new Car();} else if (vehicleType.equalsIgnoreCase("bike")) {return new Bike();}return null;}
}

在上面的代码中,VehicleFactory 类充当工厂模式,根据不同的条件返回不同的 Vehicle 实现类。

@RestController
public class VehicleController {@Autowiredprivate VehicleFactory vehicleFactory;@GetMapping("/drive/{vehicleType}")public String drive(@PathVariable String vehicleType) {Vehicle vehicle = vehicleFactory.getVehicle(vehicleType);if (vehicle != null) {vehicle.drive();return "Vehicle is driving";}return "Unknown vehicle type";}
}

3. 代理模式 (Proxy Pattern)

在 Spring 中,AOP(面向切面编程)是使用代理模式实现的。Spring AOP 通过创建代理对象来增强目标对象的行为。

示例:
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.hk.service.*.*(..))")public void handler(JoinPoint joinPoint) {System.out.println("Executing method: " + joinPoint.getSignature().getName());}
}

在上面的代码中,LoggingAspect 使用了 AOP 来创建代理对象,在方法执行前记录日志。这是代理模式的一个应用,通过代理对原始方法的行为进行增强。

4. 模板方法模式 (Template Method Pattern)

Spring 中的 JdbcTemplate 就是一个模板方法模式的经典例子。它提供了一个模板方法,开发者只需实现具体的行为。

示例:
@Component
public class EmpService {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<Emp> getAllEmployees() {String sql = "SELECT * FROM emp";return jdbcTemplate.query(sql, (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("name")));}
}

JdbcTemplate 提供了一个标准的操作数据库的流程,而开发者只需要提供具体的 SQL 查询和映射逻辑。

5. 观察者模式 (Observer Pattern)

Spring Event 机制提供了一个很好的观察者模式的实现方式。Spring 允许我们创建自定义事件并在应用中发布和监听这些事件。

示例:
// 定义事件
public class MyEvent extends ApplicationEvent {public MyEvent(Object source) {super(source);}public void say(){System.out.println("my event");}
}// 发布事件
@Component
public class MyEventPublisher {@Autowiredprivate ApplicationContext applicationContext;public void publishEvent() {MyEvent event = new MyEvent(this);applicationContext.publishEvent(event);}
}// 监听事件
@Component
public class MyEventListener {@EventListenerpublic void handleEvent(MyEvent event) {event.say();}
}

在上面的代码中,我们定义了一个事件 MyEvent,然后在 MyEventPublisher 中发布事件,并在 MyEventListener 中监听事件。这是常见的观察者模式,允许不同的组件响应事件。

6. 策略模式 (Strategy Pattern)

策略模式允许我们定义一系列算法,并将每个算法封装起来。Spring 中常通过接口和实现类来实现策略模式。

示例:
public interface PaymentStrategy {void pay(int amount);
}public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using Credit Card");}
}public class PayPalPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using PayPal");}
}@Component
public class PaymentService {private PaymentStrategy paymentStrategy;@Autowiredpublic PaymentService(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void processPayment(int amount) {paymentStrategy.pay(amount);}
}

在上面的代码中,PaymentService 类使用了策略模式,可以根据需求选择不同的支付方式。


http://www.ppmy.cn/server/143137.html

相关文章

后端-Result.java工具类和SystemCode.java工具类

一.Result.java工具类 package com.hs.util; /** * 响应格式类 * 作用&#xff1a;统一服务端的响应数据格式 */ public class Result<T> { /** * 响应代码 */ private int status; /** * 响应信息 */ private String message;…

Qt邮箱程序改良版(信号和槽)

上一版代码可以正常使用,但是会报错 上一篇文章 错误信息 "QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread" 指出了一个问题&#xff0c;即在非主线程中尝试启用或禁用套接字通知器&#xff08;QSocketNotifier&#xff09;…

【Diffusion模型】Cold Diffusion: 无噪声反转任意图像变换

Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise 标准的扩散模型涉及图像变换--添加高斯噪声和反转这种退化的图像复原算子。我们观察到,扩散模型的生成行为与图像降级的选择并无密切关系,事实上,通过改变这种选择,可以构建整个生成模型系列。即使使用…

举例矢量路由协议-RIP

前言 基于距离的矢量算法协议,跳数作为度量来衡量到达目的网络的距离. RIP主要应用与规模较小的网络中. 路由信息协议-RIP RIP是一种简单的内部网关协议.基于距离矢量的贝尔曼-福特算法(Bellman-Ford)来计算到达目的网络的最佳路径. RIP协议的开发时间较早,宽带,配置,管理方面…

柯桥生活英语口语学习“面坨了”英语怎么表达?

“面坨了”英语怎么表达&#xff1f; 要想搞清楚这个表达&#xff0c;首先&#xff0c;我们要搞明白“坨”是啥意思&#xff1f; 所谓“坨”就是指&#xff0c;面条在汤里泡太久&#xff0c;从而变涨&#xff0c;黏糊凝固在一起的状态。 有一个词汇&#xff0c;很适合用来表达这…

css 使用图片作为元素边框

先看原始图片 再看效果 边框的四个角灭有拉伸变形,但是图片的中部是拉伸的 代码 border-style: solid;/* 设置边框图像的来源 */border-image-source: url(/static/images/mmwz/index/bk_hd3x.png);/* 设置如何切割图像 */border-image-slice: 66;/* 设置边框的宽度 */border…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于改进容积卡尔曼滤波的含光伏配电网动态状态估计》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…