策略模式的介绍与实现

策略模式是什么?

策略模式是一种行为型设计模式,它允许你定义一系列算法,将每个算法封装起来,并使他们可以相互替换。
让算法独立于他的调用方而变化。

比如:我们需要根据不同的支付环境去调用不同的支付策略。
一般我们会写if else或者switch

但是有了策略模式,我们可以将每个支付策略封装成一个独立的类,
并通过上下文类来调用不同的策略。
这样就可以在不修改调用方代码的情况下,动态切换支付策略。

实现策略模式


/*
* 说明:以下代码演示策略模式(Strategy Pattern)。
* 建议在实际工程中将每个类/接口拆分到独立的文件中。
*/

/**
* 支付策略的统一接口,定义支付行为
* 策略模式的 Strategy 角色:提供算法/行为的抽象
* @author Jaymr
*/
interface PaymentStrategy {
/**
* 执行支付动作
* @param orderId 订单ID
* @param amount 支付金额(单位:分)
* @return 支付结果描述
*/
String pay(String orderId, long amount);
}

/**
* 支付宝支付策略的实现
* 策略模式的 ConcreteStrategy 角色:具体算法实现(支付宝)
* @author Jaymr
*/
class AlipayStrategy implements PaymentStrategy {
/**
* 使用支付宝渠道完成支付
* @param orderId 订单ID
* @param amount 支付金额(单位:分)
* @return 支付结果描述
*/
@Override
public String pay(String orderId, long amount) {
// 省略真实调用支付宝SDK的细节
return "Alipay success: order=" + orderId + ", amount=" + amount;
}
}

/**
* 微信支付策略的实现
* 策略模式的 ConcreteStrategy 角色:具体算法实现(微信)
* @author Jaymr
*/
class WechatPayStrategy implements PaymentStrategy {
/**
* 使用微信渠道完成支付
* @param orderId 订单ID
* @param amount 支付金额(单位:分)
* @return 支付结果描述
*/
@Override
public String pay(String orderId, long amount) {
// 省略真实调用微信SDK的细节
return "WechatPay success: order=" + orderId + ", amount=" + amount;
}
}

/**
* 现金支付策略的实现(示例)
* 策略模式的 ConcreteStrategy 角色:具体算法实现(现金)
* @author Jaymr
*/
class CashStrategy implements PaymentStrategy {
/**
* 使用现金渠道完成支付(示例:直接标记成功)
* @param orderId 订单ID
* @param amount 支付金额(单位:分)
* @return 支付结果描述
*/
@Override
public String pay(String orderId, long amount) {
return "Cash success: order=" + orderId + ", amount=" + amount;
}
}

/**
* 策略上下文,持有并使用某个支付策略
* 策略模式的 Context 角色:对外提供统一入口,内部委托给策略
* @author Jaymr
*/
class PaymentContext {
private PaymentStrategy strategy;

/**
* 通过构造器注入具体策略
* @param strategy 支付策略实例
*/
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}

/**
* 执行支付流程(将调用委托给当前策略)
* @param orderId 订单ID
* @param amount 支付金额(单位:分)
* @return 支付结果
*/
public String executePay(String orderId, long amount) {
return strategy.pay(orderId, amount);
}

/**
* 运行时切换策略(可选)
* 比如:正在进行支付宝支付时,可以通过setStrategy方法切换为微信支付策略
* @param strategy 新的支付策略
*/
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
}

/**
* 简单的策略工厂/注册表:根据渠道选择策略
* 可替换为使用 Spring 容器或枚举映射进行更稳妥的管理
* @author Jaymr
*/
class PaymentStrategyFactory {
/**
* 根据支付渠道字符串返回相应策略
* @param channel 支付渠道(如 "ALIPAY"、"WECHAT"、"CASH")
* @return 对应的支付策略实例
* @throws IllegalArgumentException 当渠道不支持时抛出异常
*/
public static PaymentStrategy getStrategy(String channel) {
switch (channel) {
case "ALIPAY": return new AlipayStrategy();
case "WECHAT": return new WechatPayStrategy();
case "CASH": return new CashStrategy();
default: throw new IllegalArgumentException("Unsupported channel: " + channel);
}
}
}

/**
* 使用示例(客户端)
* 通过工厂选择策略,并在上下文中执行;演示运行时切换策略
* @author Jaymr
*/
public class StrategyDemo {
/**
* 主函数,演示策略模式的使用
* @param args 命令行参数
*/
public static void main(String[] args) {
// 选择支付宝策略 多态思想:根据渠道字符串选择具体策略
// 通过静态工厂获取具体支付策略实例,创建策略上下文,将策略实例注入;最后通过上下文执行支付
PaymentStrategy strategy = PaymentStrategyFactory.getStrategy("ALIPAY");
PaymentContext ctx = new PaymentContext(strategy);

// 执行一次支付
String result = ctx.executePay("ORD123456", 19900);
System.out.println(result);

// 运行时切换为微信策略
ctx.setStrategy(PaymentStrategyFactory.getStrategy("WECHAT"));
String result2 = ctx.executePay("ORD123456", 19900);
System.out.println(result2);
}
}