# 设计模式在电商系统中的实战应用:通过MVC和策略模式优化核心场景

---

## 引言

在电商系统的开发中,面对复杂需求(如促销活动、多支付方式、用户行为分析等),传统代码结构往往导致代码冗余、维护困难。设计模式作为软件开发的最佳实践,能帮助开发者高效解决这些问题。本文通过 MVC模式 管理系统分层,结合 策略模式 优化支付与促销逻辑,展示如何用代码实现高内聚、低耦合的电商系统。

---

## 一、MVC模式:电商系统的架构核心优化

### 1.1 MVC模式的核心思想

MVC(Model-View-Controller)将系统分为三层:

- Model:数据层(数据库访问、实体对象)。

- View:视图层(页面渲染、用户交互)。

- Controller:控制层(业务逻辑处理、协调Model与View)。

意图:通过分层解耦,提升可维护性和扩展性。

---

### 1.2 电商场景中的MVC实践

#### 示例:商品展示与下单流程

```java

// Model层:商品实体

public class Product {

private int id;

private String name;

private double price;

// Getters and Setters

}

// Model层:数据库操作

public interface ProductDAO {

Product getProductById(int id);

void saveToCart(Product product, int userId);

}

// Controller层:业务逻辑

@Controller

public class ProductController {

@Autowired

private ProductDAO productDAO;

@GetMapping(/product/{id})

public String showProduct(@PathVariable int id, Model model) {

Product product = productDAO.getProductById(id);

model.addAttribute(product, product);

return product_detail; // View层JSP/Thymeleaf模板

}

@PostMapping(/addToCart)

public String addToCart(@RequestParam int productId, @SessionAttribute(user) User user) {

Product product = productDAO.getProductById(productId);

productDAO.saveToCart(product, user.getId());

return redirect:/cart;

}

}

```

#### 优势分析:

- 解耦分层:页面逻辑(View)与业务逻辑(Controller)分离,前端可独立修改界面。

- 高可维护性:新增促销功能仅需在Controller层添加降价逻辑,无需改动DAO层、界面层。

---

## 二、策略模式(Strategy Pattern):灵活应对动态场景

### 2.1 策略模式的核心思想

定义一族算法(如“支付方式”或“促销策略”),封装为可互换的接口,通过运行时配置选择具体实现。

意图:避免条件判断(if-else)代码复杂度,支持动态扩展。

---

### 2.2 电商场景中的两大典型应用

#### 应用场景1:多支付方式切换

```java

// 策略接口:定义支付行为

public interface PaymentStrategy {

String processPayment(double amount);

}

// 具体策略:支付宝支付

public class AlipayStrategy implements PaymentStrategy {

@Override

public String processPayment(double amount) {

// 调用支付宝API

return Alipay: + amount + 元支付成功;

}

}

// 具体策略:微信支付

public class WechatPayStrategy implements PaymentStrategy {

@Override

public String processPayment(double amount) {

// 调用微信API

return WechatPay: + amount + 元支付成功;

}

}

// 上下文:客户端决定策略

public class PaymentService {

private PaymentStrategy paymentStrategy;

public void setPaymentStrategy(PaymentStrategy strategy) {

this.paymentStrategy = strategy;

}

public String doPayment(double amount) {

return paymentStrategy.processPayment(amount);

}

}

```

实际调用:

```java

PaymentService service = new PaymentService();

// 根据用户选择动态切换

service.setPaymentStrategy(new AlipayStrategy());

service.doPayment(99.9);

```

#### 应用场景2:动态促销策略组合

```java

// 策略接口:定义促销算法

public interface DiscountStrategy {

double calculateDiscount(double originalPrice);

}

// 具体策略:满200减50

public class ThresholdDiscount implements DiscountStrategy {

@Override

public double calculateDiscount(double price) {

return price >= 200 ? price - 50 : price;

}

}

// 具体策略:会员折扣(8折)

public class MemberDiscount implements DiscountStrategy {

@Override

public double calculateDiscount(double price) {

return price 0.8;

}

}

// 上下文:组合策略调用

public class PromotionService {

private DiscountStrategy currentStrategy;

public void setDiscountStrategy(DiscountStrategy strategy) {

this.currentStrategy = strategy;

}

public double applyDiscount(double price) {

if (currentStrategy == null) return price;

return currentStrategy.calculateDiscount(price);

}

}

```

#### 动态配置示例:

```java

PromotionService promotion = new PromotionService();

// 运行时选择“满减”策略

promotion.setDiscountStrategy(new ThresholdDiscount());

double finalPrice = promotion.applyDiscount(300); // 输出250

```

---

## 三、实战价值与扩展思考

### 3.1 策略模式的优势对比

| 传统写法 | 策略模式 |

|--------------------------|----------------------------|

| 利用if-else判断多种场景 | 接口封装算法,解耦主逻辑 |

| 新增支付方式需修改现有代码| 新策略实现接口,无需改动原有代码 |

| 扩展性差、可读性低 | 开闭原则(对扩展开放,对修改关闭) |

---

### 3.2 更复杂的策略组合场景

通过组合设计模式(Composite) 进一步扩展:

```java

// 组合策略接口(组合多个策略)

public interface CompositeDiscountStrategy extends DiscountStrategy {

void addStrategy(DiscountStrategy strategy);

void removeStrategy(DiscountStrategy strategy);

}

// 实现链式计算

public class ChainDiscount implements CompositeDiscountStrategy {

private List strategyList;

@Override

public void addStrategy(DiscountStrategy strategy) {

strategyList.add(strategy);

}

@Override

public double calculateDiscount(double price) {

for (DiscountStrategy s : strategyList) {

price = s.calculateDiscount(price);

}

return price;

}

}

```

---

## 总结

在电商系统优化中:

1. MVC模式 从架构层面实现分层解耦,使系统更易维护;

2. 策略模式 在业务层屏蔽算法差异,支持灵活扩展(如新增支付方式、促销规则),减少重复代码;

3. 结合组合模式可进一步实现策略合并,满足复杂业务需求。

通过使用设计模式,开发者能专注于核心业务逻辑的实现,同时保证代码的健壮性与可扩展性。例如,促销规则更新仅需新增策略类,无需改动原有代码,极大缩短了开发周期与迭代成本。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐