引言
在软件开发中,我们经常会遇到这样的情况:实现同一个功能有多种算法或策略,而我们需要根据不同的情况选择不同的实现方式。传统的做法是将这些算法硬编码在业务逻辑中,通过大量的 if-else 或 switch-case 来判断使用哪种算法。这种做法不仅导致代码臃肿,而且难以维护和扩展。
策略模式(Strategy Pattern)正是为解决这类问题而生。本文将详细介绍策略模式的定义、结构、实现方式,并结合 Java 实际案例,探讨如何在 Spring 框架中优雅地应用策略模式。
一、策略模式概述
1.1 定义与核心思想
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。
核心思想:针对接口编程,而不是针对实现编程。将可变的部分从程序中抽象分离,形成算法的独立族,而在上下文(Context)中委派给具体的策略实现。
1.2 模式结构
策略模式包含三个核心角色:
- Context(上下文):持有一个策略对象的引用,负责调用策略对象的算法。
- Strategy(抽象策略):定义所有策略类必须实现的公共接口。
- ConcreteStrategy(具体策略):实现抽象策略接口,提供具体的算法实现。
1.3 类图
+---------------+ +-------------------+
| Context | | <<interface>> |
+---------------+ | Strategy |
| - strategy |---------------------->
+---------------+ +-------------------+
| + execute() | |
+---------------+ |
v
+---------------+---------------+-----+-------+
| | | |
+-----------+----+ +-----------+----+ +-----------+----+
|ConcreteStrategyA| |ConcreteStrategyB| |ConcreteStrategyC|
+----------------+ +----------------+ +----------------+
| + algorithm() | | + algorithm() | | + algorithm() |
+----------------+ +----------------+ +----------------+
二、策略模式的 Java 实现示例
让我们通过一个电商促销活动的例子来演示策略模式的实现。
场景描述
一个电商平台需要支持多种促销策略:
- 满减促销
- 折扣促销
- 无促销(原价)
2.1 定义抽象策略接口
/**
* 促销策略接口
*/
public interface PromotionStrategy {
/**
* 计算促销后的价格
*
* originalPrice 原价
* 促销后价格
*/
;
String ;
}

