专业的编程技术博客社区

网站首页 > 博客文章 正文

Spring Boot 实战:运用访问者模式灵活扩展订单处理逻辑

baijin 2024-10-01 07:33:08 博客文章 11 ℃ 0 评论

在软件开发中,随着业务需求的变化,我们经常需要为现有的类结构添加新的行为。传统的方法是直接修改这些类来添加新的方法,但这会导致类变得越来越复杂,并且违反了开放封闭原则(Open-Closed Principle)。访问者模式提供了一种优雅的解决方案,它让我们可以在不修改现有类的前提下,为这些类添加新的行为。

1. 访问者模式简介

访问者模式定义了一个操作的接口,并将此操作绑定到一个对象结构中的各个元素上。当需要为这个对象结构中的元素增加新的操作时,可以创建一个新的访问者,而不必改变原来的元素类。这使得我们可以很容易地定义新的操作,而无需修改原有的代码。

2. 实战案例

假设我们有一个电商系统,其中包含不同的订单类型,如普通订单、VIP订单等。我们需要根据订单类型计算出不同的运费。随着时间的推移,我们可能还需要增加更多的订单类型和更多的计算逻辑。为了便于扩展,我们可以使用访问者模式。

3. 构建 Spring Boot 项目

首先,我们创建一个新的 Spring Boot 项目。可以使用 Spring Initializr 快速生成项目骨架。

3.1 添加依赖

我们需要添加 Spring Web 和 Lombok 依赖。

xml

深色版本

1<!-- pom.xml -->
2<dependencies>
3    <dependency>
4        <groupId>org.springframework.boot</groupId>
5        <artifactId>spring-boot-starter-web</artifactId>
6    </dependency>
7    <dependency>
8        <groupId>org.projectlombok</groupId>
9        <artifactId>lombok</artifactId>
10        <optional>true</optional>
11    </dependency>
12</dependencies>

3.2 定义实体类

定义两个实体类 Order 和具体的订单类型 NormalOrder 和 VipOrder。

java

深色版本

1public abstract class Order {
2    private String id;
3    private double price;
4
5    public String getId() {
6        return id;
7    }
8
9    public void setId(String id) {
10        this.id = id;
11    }
12
13    public double getPrice() {
14        return price;
15    }
16
17    public void setPrice(double price) {
18        this.price = price;
19    }
20}
21
22public class NormalOrder extends Order {
23    // 具体的普通订单实现
24}
25
26public class VipOrder extends Order {
27    // 具体的 VIP 订单实现
28}

3.3 定义访问者接口

定义一个 ShippingCostCalculator 接口,用于计算运费。

java

深色版本

1public interface ShippingCostCalculator {
2    double calculate(Order order);
3}

3.4 实现访问者

实现具体的访问者类,例如 StandardShippingCostCalculator。

java

深色版本

1public class StandardShippingCostCalculator implements ShippingCostCalculator {
2    @Override
3    public double calculate(Order order) {
4        if (order instanceof NormalOrder) {
5            return 5.0; // 普通订单的固定运费
6        } else if (order instanceof VipOrder) {
7            return 0.0; // VIP 订单免运费
8        }
9        return 0.0;
10    }
11}

3.5 使用访问者

创建一个 REST 控制器来展示如何使用访问者模式。

java

深色版本

1@RestController
2@RequestMapping("/orders")
3public class OrderController {
4
5    private final ShippingCostCalculator shippingCostCalculator;
6
7    public OrderController(ShippingCostCalculator shippingCostCalculator) {
8        this.shippingCostCalculator = shippingCostCalculator;
9    }
10
11    @GetMapping("/{id}")
12    public ResponseEntity<Double> getShippingCost(@PathVariable String id) {
13        Order order = getOrderById(id); // 假设这里实现了获取订单的方法
14        double cost = shippingCostCalculator.calculate(order);
15        return ResponseEntity.ok(cost);
16    }
17
18    private Order getOrderById(String id) {
19        // 根据 ID 返回具体的订单实例
20        return new NormalOrder(); // 示例返回普通订单
21    }
22}

4. 运行应用

运行 Spring Boot 应用并测试端点。

bash

深色版本

1$ mvn spring-boot:run

访问 http://localhost:8080/orders/123,查看结果。

5. 总结

通过访问者模式,我们可以轻松地扩展应用的功能,而无需修改现有的类。在这个例子中,我们可以通过简单的添加新的 ShippingCostCalculator 实现来支持新的订单类型或新的运费计算规则。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表