假设我们要设计一个电商系统,支持多种支付方式(如支付宝、微信、信用卡)。我们可以使用策略模式将不同的支付方式封装为不同的策略,使其可以灵活切换。
1. 定义支付策略接口
// 支付策略接口
public interface PaymentStrategy {
void pay(double amount);
}
2. 具体支付策略(支付宝、微信、信用卡)
// 支付宝支付策略
public class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("使用支付宝支付 " + amount + " 元");
}
}
// 微信支付策略
public class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("使用微信支付 " + amount + " 元");
}
}
// 信用卡支付策略
public class CreditCardStrategy implements PaymentStrategy {
private String cardNumber;
public CreditCardStrategy(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(double amount) {
System.out.println("使用信用卡 " + cardNumber + " 支付 " + amount + " 元");
}
}
3. 订单类,使用策略模式进行支付
public class Order {
private PaymentStrategy paymentStrategy;
// 设置支付策略
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
// 执行支付
public void pay(double amount) {
if (paymentStrategy == null) {
throw new IllegalStateException("未设置支付方式");
}
paymentStrategy.pay(amount);
}
}
4. 测试策略模式
public class StrategyPatternDemo {
public static void main(String[] args) {
Order order = new Order();
// 使用支付宝支付
order.setPaymentStrategy(new AlipayStrategy());
order.pay(100.00);
// 使用微信支付
order.setPaymentStrategy(new WeChatPayStrategy());
order.pay(200.00);
// 使用信用卡支付
order.setPaymentStrategy(new CreditCardStrategy("1234-5678-9876-5432"));
order.pay(300.00);
}
}
运行结果
使用支付宝支付 100.0 元
使用微信支付 200.0 元
使用信用卡 1234-5678-9876-5432 支付 300.0 元
总结
PaymentStrategy
定义了支付策略的接口。AlipayStrategy
、WeChatPayStrategy
、CreditCardStrategy
是不同的支付方式,实现了PaymentStrategy
接口。Order
类持有PaymentStrategy
,在运行时动态设置具体的支付策略。- 在
StrategyPatternDemo
中,客户端可以灵活切换不同的支付方式,而无需修改Order
类的代码,符合 “开闭原则”。