设计模式-策略模式

1. 核心角色与类结构

策略模式包含 3 个核心角色,代码中对应如下:

  • 策略接口(Strategy)PaymentStrategy,定义所有支持的算法的公共接口。
  • 具体策略(Concrete Strategy)CreditCardPaymentPayPalPaymentWeChatPayment,实现策略接口,提供具体的算法实现。
  • 上下文(Context)ShoppingCart,持有策略接口的引用,负责使用策略对象,屏蔽算法的具体实现细节。
  • 使用示例(StrategyDemo):演示如何通过上下文动态切换不同策略。

2. 代码逐部分解析

(1)策略接口(PaymentStrategy)
复制代码
public interface PaymentStrategy {
    void pay(int amount);
}
  • 定义了所有支付方式的统一接口,声明了pay方法(参数amount为支付金额)。
  • 接口的作用是规范所有具体支付策略的行为,确保上下文(ShoppingCart)可以通过统一的方式调用不同的支付算法。
(2)具体策略(支付方式实现)

具体策略类实现PaymentStrategy接口,提供不同支付方式的具体逻辑:

① 信用卡支付(CreditCardPayment)
复制代码
public class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;  // 信用卡号(策略的私有参数)
    
    public CreditCardPayment(String cardNumber) {
        this.cardNumber = cardNumber;  // 初始化支付所需的参数
    }
    
    @Override
    public void pay(int amount) {
        // 具体支付逻辑:使用信用卡支付
        System.out.println("使用信用卡支付 " + amount + " 元");
    }
}
② PayPal 支付(PayPalPayment)
复制代码
public class PayPalPayment implements PaymentStrategy {
    private String email;  // PayPal账号(策略的私有参数)
    
    public PayPalPayment(String email) {
        this.email = email;  // 初始化支付所需的参数
    }
    
    @Override
    public void pay(int amount) {
        // 具体支付逻辑:使用PayPal支付
        System.out.println("使用PayPal支付 " + amount + " 元");
    }
}
③ 微信支付(WeChatPayment)
复制代码
public class WeChatPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        // 具体支付逻辑:使用微信支付(无需额外参数)
        System.out.println("使用微信支付 " + amount + " 元");
    }
}
  • 核心特点:每个具体策略都封装了一种独立的支付算法,它们的实现细节(如是否需要账号、如何支付)被隔离在各自的类中。
  • 灵活性 :新增支付方式(如支付宝)时,只需新增一个实现PaymentStrategy的类,无需修改现有代码,符合 "开闭原则"。
(3)上下文(ShoppingCart)
复制代码
public class ShoppingCart {
    // 持有策略接口的引用(面向接口编程,不依赖具体策略)
    private PaymentStrategy paymentStrategy;
    
    // 动态设置策略(允许在运行时切换支付方式)
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
    
    // 结账方法:委托给当前策略执行支付
    public void checkout(int amount) {
        paymentStrategy.pay(amount);  // 调用策略的支付逻辑
    }
}
  • 作用:作为客户端与策略之间的中间层,负责协调策略的使用,屏蔽具体策略的实现细节。
  • 关键设计
    • 通过setPaymentStrategy方法,允许在运行时动态切换支付策略(如从信用卡切换到微信支付)。
    • checkout方法不关心具体用哪种方式支付,只需调用策略接口的pay方法,体现了 "依赖倒置原则"(依赖抽象,不依赖具体)。
(4)使用示例(StrategyDemo)
复制代码
public class StrategyDemo {
    public static void main(String[] args) {
        // 创建上下文(购物车)
        ShoppingCart cart = new ShoppingCart();
        
        // 1. 使用信用卡支付
        cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456"));
        cart.checkout(100);  // 输出:使用信用卡支付 100 元
        
        // 2. 动态切换为微信支付
        cart.setPaymentStrategy(new WeChatPayment());
        cart.checkout(200);  // 输出:使用微信支付 200 元
    }
}
  • 执行流程
    1. 创建ShoppingCart对象(上下文)。
    2. 通过setPaymentStrategy为购物车设置具体支付策略(如信用卡)。
    3. 调用checkout方法,购物车会委托当前策略完成支付。
    4. 可随时调用setPaymentStrategy切换策略(如切换到微信支付),无需修改购物车的核心逻辑。

3. 策略模式的核心优势

  • 算法复用与隔离:每种算法(支付方式)被封装在独立的类中,便于复用和维护,修改一种策略不会影响其他策略。
  • 动态切换:客户端可以在运行时根据需求切换策略(如用户选择不同支付方式),灵活性极高。
  • 消除条件判断 :相比用if-elseswitch判断不同支付方式的实现(如if (type == "creditCard") { ... } else if (...)),策略模式通过多态避免了冗长的条件判断,代码更清晰。
  • 符合开闭原则:新增策略时只需实现接口,无需修改上下文或其他策略,扩展性好。

总结

以上策略模式优雅地实现了 "购物车支持多种支付方式,且可动态切换" 的场景。核心是将支付算法封装为独立策略,通过上下文统一调用,实现算法与使用场景的解耦。该模式在需要灵活选择不同行为(如排序算法、折扣计算、日志输出方式等)的场景中应用广泛。

相关推荐
带刺的坐椅12 分钟前
Solon I18n:三种解析器,零样板代码
java·国际化·i18n·solon·多语言
掉鱼的猫22 分钟前
Solon I18n:三种解析器,零样板代码
java
程序员阿明39 分钟前
spring boot3访问resources下的文件,使得在浏览器url中可以直接访问
java·spring boot·后端
wuminyu1 小时前
JUC包的AQS与JVM的ObjectMonitor机制对比分析
java·linux·c语言·jvm·c++
霸道流氓气质1 小时前
SpringBoot中使用OAuth2 认证与 JWT Token — 概念、原理与实践
java·spring boot·后端
dogstarhuang1 小时前
Kimi K3 本地部署实战:从 1.56TB 权重到推理服务的完整成本分析
java·人工智能·后端·ai·开源·接口·程序员创富
就不掉头发1 小时前
C++函数模板
java·开发语言·c++
用户298698530141 小时前
Word 转 PDF 的 3 种自动化实现:从桌面操作到后端服务集成
java·人工智能·后端
我是苏苏1 小时前
WPF开发01:基础控件及常用模板篇
开发语言·c#·html·wpf
wuyk5551 小时前
89.嵌入式内存管理的“稳定利器”:内存池原理与C语言实现
c语言·开发语言·stm32·单片机·嵌入式硬件