网站首页 > 博客文章 正文
在软件开发中,随着业务需求的变化,我们经常需要为现有的类结构添加新的行为。传统的方法是直接修改这些类来添加新的方法,但这会导致类变得越来越复杂,并且违反了开放封闭原则(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 实现来支持新的订单类型或新的运费计算规则。
猜你喜欢
- 2024-10-01 设计模式——备忘录模式(备忘录界面设计)
- 2024-10-01 设计模式 之 行为型模式(行为型设计模式特点)
- 2024-10-01 Go语言设计模式-访问者(go语言有设计模式吗)
- 2024-10-01 visitor pattern 访问者模式(访问者模式工作原理)
- 2024-10-01 Aha!设计模式(105)-访问者模式(1)
- 2024-10-01 GOF设计模式(命令模式,访问者模式,迭代器模式,观察者模式)
- 2024-10-01 设计模式第2招第9式之解释器模式(解释器原理)
- 2024-10-01 设计模式第2招第1式之观察者模式(观察者设计模式的优点)
- 2024-10-01 「编程设计」访问者(Visitor)模式-补丁式为原体系增加新功能
- 2024-10-01 访问者模式的结构(访问者模式的结构是)
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)