赞
踩
在许多电子商务系统中,处理订单的过程可能因订单类型的不同而有所差异。不同的订单可能需要不同的处理逻辑,例如普通订单、优先订单或促销订单。策略模式可以帮助我们以一种灵活的方式实现这些不同的处理逻辑。
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。
假设我们有一个电商平台,需要支持多种订单类型的处理逻辑,包括:
定义策略接口 - 首先定义一个策略接口,声明所有支持的策略共有的方法。
java深色版本
- 1public interface OrderHandlingStrategy {
- 2 void handleOrder(Order order);
- 3}
实现具体的策略类 - 接下来,为每种订单类型实现具体的策略类。
普通订单处理策略
java深色版本
- 1import org.springframework.stereotype.Component;
- 2
- 3@Component
- 4public class RegularOrderHandlingStrategy implements OrderHandlingStrategy {
- 5 @Override
- 6 public void handleOrder(Order order) {
- 7 System.out.println("Handling regular order: " + order.getId());
- 8 // Regular handling logic
- 9 }
- 10}
优先订单处理策略
java深色版本
- 1import org.springframework.stereotype.Component;
- 2
- 3@Component
- 4public class PriorityOrderHandlingStrategy implements OrderHandlingStrategy {
- 5 @Override
- 6 public void handleOrder(Order order) {
- 7 System.out.println("Handling priority order: " + order.getId());
- 8 // Priority handling logic
- 9 }
- 10}
促销订单处理策略
java深色版本
- 1import org.springframework.stereotype.Component;
- 2
- 3@Component
- 4public class PromotionalOrderHandlingStrategy implements OrderHandlingStrategy {
- 5 @Override
- 6 public void handleOrder(Order order) {
- 7 System.out.println("Handling promotional order: " + order.getId());
- 8 // Promotional handling logic
- 9 }
- 10}
定义订单类 - 定义一个订单类,用于封装订单的必要信息。
java深色版本
- 1public class Order {
- 2 private int id;
- 3 private OrderType type;
- 4
- 5 public Order(int id, OrderType type) {
- 6 this.id = id;
- 7 this.type = type;
- 8 }
- 9
- 10 public int getId() {
- 11 return id;
- 12 }
- 13
- 14 public OrderType getType() {
- 15 return type;
- 16 }
- 17}
定义订单类型枚举 - 为订单类型定义一个枚举类。
java深色版本
- 1public enum OrderType {
- 2 REGULAR,
- 3 PRIORITY,
- 4 PROMOTIONAL
- 5}
使用策略 - 最后,在我们的业务逻辑中,根据需要选择并使用相应的策略。
java深色版本
- 1import org.springframework.beans.factory.annotation.Autowired;
- 2import org.springframework.stereotype.Service;
- 3
- 4import java.util.Map;
- 5
- 6@Service
- 7public class OrderService {
- 8
- 9 private final Map<OrderType, OrderHandlingStrategy> strategies;
- 10
- 11 @Autowired
- 12 public OrderService(Map<OrderType, OrderHandlingStrategy> strategies) {
- 13 this.strategies = strategies;
- 14 }
- 15
- 16 public void processOrder(Order order) {
- 17 OrderHandlingStrategy strategy = strategies.get(order.getType());
- 18 if (strategy != null) {
- 19 strategy.handleOrder(order);
- 20 } else {
- 21 throw new IllegalArgumentException("Unsupported order type: " + order.getType());
- 22 }
- 23 }
- 24}
控制器 - 我们还需要一个控制器来测试这个逻辑。
java深色版本
- 1import org.springframework.beans.factory.annotation.Autowired;
- 2import org.springframework.web.bind.annotation.GetMapping;
- 3import org.springframework.web.bind.annotation.RequestMapping;
- 4import org.springframework.web.bind.annotation.RequestParam;
- 5import org.springframework.web.bind.annotation.RestController;
- 6
- 7@RestController
- 8@RequestMapping("/orders")
- 9public class OrderController {
- 10
- 11 private final OrderService orderService;
- 12
- 13 @Autowired
- 14 public OrderController(OrderService orderService) {
- 15 this.orderService = orderService;
- 16 }
- 17
- 18 @GetMapping("/process")
- 19 public String processOrder(@RequestParam("id") int id,
- 20 @RequestParam("type") String type) {
- 21 Order order = new Order(id, OrderType.valueOf(type.toUpperCase()));
- 22 orderService.processOrder(order);
- 23 return "Order processed successfully.";
- 24 }
- 25}
测试 - 最后,我们可以通过发送 HTTP 请求来测试不同的订单处理逻辑。
bash深色版本
- 1curl 'http://localhost:8080/orders/process?id=1&type=REGULAR'
- 2curl 'http://localhost:8080/orders/process?id=2&type=PRIORITY'
- 3curl 'http://localhost:8080/orders/process?id=3&type=PROMOTIONAL'
通过使用策略模式,我们可以在运行时灵活地选择不同的订单处理逻辑。这种方式不仅提高了代码的可读性和可维护性,还使得扩展新的订单类型变得非常简单。在 Spring Boot 中,依赖注入机制进一步简化了策略模式的实现过程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。