策略模式介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来并使它们可相互替换。策略模式让算法的变化独立于使用算法的客户端,从而实现灵活的算法切换。
核心角色:
- • 环境类(Context):持有策略接口的引用,负责调用具体策略
- • 策略接口(Strategy):定义所有支持的算法的公共接口
- • 具体策略类(ConcreteStrategy):实现策略接口,提供具体算法实现
Java代码实现示例
下面通过一个"支付方式选择"的场景来演示策略模式:
// 策略接口:定义支付算法的公共接口
public interface PaymentStrategy {
void pay(double amount);
}
// 具体策略类:PayPal支付
public class PayPalPayment implements PaymentStrategy {
private String emailId;
private String password;
public PayPalPayment(String emailId, String password) {
this.emailId = emailId;
this.password = password;
}
@Override
public void pay(double amount) {
System.out.println(amount + " 元用PayPal支付。");
// 实际应用中会有验证PayPal账号、连接PayPal接口等逻辑
}
}
// 具体策略类:信用卡支付
public class CreditCardPayment implements PaymentStrategy {
private String name;
private String cardNumber;
private String cvv;
private String expiryDate;
public CreditCardPayment(String name, String cardNumber, String cvv, String expiryDate) {
this.name = name;
this.cardNumber = cardNumber;
this.cvv = cvv;
this.expiryDate = expiryDate;
}
@Override
public void pay(double amount) {
System.out.println(amount + " 元用信用卡支付。");
// 实际应用中会有验证信用卡信息、连接支付网关等逻辑
}
}
// 环境类:购物车,使用支付策略
public class ShoppingCart {
private PaymentStrategy paymentStrategy;
// 设置支付策略
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
// 结算
public void checkout(double amount) {
if (paymentStrategy == null) {
throw new IllegalStateException("请先设置支付方式");
}
paymentStrategy.pay(amount);
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 选择信用卡支付
PaymentStrategy creditCardPayment = new CreditCardPayment(
"张三", "1234-5678-9012-3456", "123", "12/25");
cart.setPaymentStrategy(creditCardPayment);
cart.checkout(100.50);
// 切换为PayPal支付
PaymentStrategy paypalPayment = new PayPalPayment("zhangsan@example.com", "password123");
cart.setPaymentStrategy(paypalPayment);
cart.checkout(200.75);
}
}
代码解释
-
- 策略接口(PaymentStrategy) :
- • 定义了所有支付方式的统一接口
pay(double amount)
- • 确保所有支付方式都遵循相同的调用规范
-
- 具体策略类 :
- •
CreditCardPayment
:实现信用卡支付的具体逻辑 - •
PayPalPayment
:实现PayPal支付的具体逻辑 - • 每个策略类都封装了自己的算法实现,相互独立
-
- 环境类(ShoppingCart) :
- • 持有支付策略的引用,通过
setPaymentStrategy
方法设置具体策略 - • 提供
checkout
方法,内部调用当前策略的pay
方法完成支付 - • 客户端无需知道具体支付细节,只需与购物车交互
-
- 客户端(Main) :
- • 创建具体的支付策略对象
- • 通过购物车设置支付策略并完成结算
- • 可以随时切换不同的支付策略,无需修改购物车代码
策略模式的优势
- • 灵活性高:可以在运行时动态切换算法
- • 代码复用:避免使用多重条件判断(if-else或switch)
- • 开闭原则:新增策略只需实现接口,无需修改现有代码
- • 责任单一:每个策略类专注于实现一种算法
适用场景:当一个系统需要多种算法,且需要动态选择使用哪种算法时,适合使用策略模式。
更多参考资料
https://pan.baidu.com/s/1c1oQItiA7nZxz8Rnl3STpw?pwd=yftc
https://pan.quark.cn/s/dec9e4868381