策略模式(Strategy Pattern) 是一种行为型设计模式,它允许你在运行时选择算法或行为的具体实现。
✅ 核心思想:定义一系列算法,并将每种算法封装起来,使它们可以互换。
这使得算法的变化独立于使用它的客户端代码 ------ 符合"开闭原则"(对扩展开放,对修改关闭)。
java
/**
* 支付策略接口
*/
public interface PaymentStrategy {
/**
* 执行支付
* @param amount 支付金额
* @return 支付结果
*/
boolean pay(double amount);
}
java
/**
* 支付宝支付策略实现
*/
public class AlipayStrategy implements PaymentStrategy {
@Override
public boolean pay(double amount) {
System.out.println("使用支付宝支付: ¥" + String.format("%.2f", amount));
// 模拟支付流程
System.out.println("正在跳转至支付宝...");
System.out.println("请扫码完成支付");
System.out.println("支付成功!");
return true;
}
}
java
/**
* 微信支付策略实现
*/
public class WechatPayStrategy implements PaymentStrategy {
@Override
public boolean pay(double amount) {
System.out.println("使用微信支付: ¥" + String.format("%.2f", amount));
// 模拟支付流程
System.out.println("正在跳转至微信...");
System.out.println("请扫码完成支付");
System.out.println("支付成功!");
return true;
}
}
java
/**
* 信用卡支付策略实现
*/
public class CreditCardStrategy implements PaymentStrategy {
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public CreditCardStrategy(String cardNumber, String cvv, String dateOfExpiry) {
this.cardNumber = cardNumber;
this.cvv = cvv;
this.dateOfExpiry = dateOfExpiry;
}
@Override
public boolean pay(double amount) {
System.out.println("使用信用卡支付: ¥" + String.format("%.2f", amount));
System.out.println("卡号: " + maskCardNumber(cardNumber));
System.out.println("验证信用卡信息...");
System.out.println("扣款成功!");
return true;
}
private String maskCardNumber(String cardNumber) {
if (cardNumber == null || cardNumber.length() < 4) {
return "****";
}
return "**** **** **** " + cardNumber.substring(cardNumber.length() - 4);
}
}
java
/**
* 支付上下文类,用于管理支付策略
*/
public class PaymentContext {
private PaymentStrategy strategy;
/**
* 构造函数
* @param strategy 支付策略
*/
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
/**
* 执行支付
* @param amount 支付金额
* @return 支付结果
*/
public boolean executePayment(double amount) {
return strategy.pay(amount);
}
/**
* 更换支付策略
* @param strategy 新的支付策略
*/
public void setPaymentStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
}
java
/**
* 订单类
*/
public class Order {
private String orderId;
private double amount;
public Order(String orderId, double amount) {
this.orderId = orderId;
this.amount = amount;
}
public String getOrderId() {
return orderId;
}
public double getAmount() {
return amount;
}
@Override
public String toString() {
return "Order{" +
"orderId='" + orderId + '\'' +
", amount=¥" + String.format("%.2f", amount) +
'}';
}
}
java
/**
* 策略模式演示应用程序
* 模拟电商平台的订单支付场景
*/
public class PaymentApplication {
public static void main(String[] args) {
// 场景一:用户选择支付宝支付
System.out.println("=== 订单支付场景演示 ===");
Order order1 = new Order("ORD001", 299.99);
PaymentStrategy alipayStrategy = new AlipayStrategy();
PaymentContext context = new PaymentContext(alipayStrategy);
System.out.println(order1);
context.executePayment(order1.getAmount());
System.out.println();
// 场景二:用户更换为微信支付
System.out.println("用户改变主意,选择微信支付...");
PaymentStrategy wechatPayStrategy = new WechatPayStrategy();
context.setPaymentStrategy(wechatPayStrategy);
context.executePayment(order1.getAmount());
System.out.println();
// 场景三:大额订单使用信用卡支付
Order order2 = new Order("ORD002", 1999.00);
System.out.println("大额订单:");
System.out.println(order2);
PaymentStrategy creditCardStrategy = new CreditCardStrategy("1234567890123456", "123", "12/28");
context.setPaymentStrategy(creditCardStrategy);
context.executePayment(order2.getAmount());
}
}