java 策略模式 demo

策略模式介绍

策略模式(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);
    }
}

代码解释

    1. 策略接口(PaymentStrategy)
    • • 定义了所有支付方式的统一接口pay(double amount)
    • • 确保所有支付方式都遵循相同的调用规范
    1. 具体策略类
    • CreditCardPayment:实现信用卡支付的具体逻辑
    • PayPalPayment:实现PayPal支付的具体逻辑
    • • 每个策略类都封装了自己的算法实现,相互独立
    1. 环境类(ShoppingCart)
    • • 持有支付策略的引用,通过setPaymentStrategy方法设置具体策略
    • • 提供checkout方法,内部调用当前策略的pay方法完成支付
    • • 客户端无需知道具体支付细节,只需与购物车交互
    1. 客户端(Main)
    • • 创建具体的支付策略对象
    • • 通过购物车设置支付策略并完成结算
    • • 可以随时切换不同的支付策略,无需修改购物车代码

策略模式的优势

  • 灵活性高:可以在运行时动态切换算法
  • 代码复用:避免使用多重条件判断(if-else或switch)
  • 开闭原则:新增策略只需实现接口,无需修改现有代码
  • 责任单一:每个策略类专注于实现一种算法

适用场景:当一个系统需要多种算法,且需要动态选择使用哪种算法时,适合使用策略模式。

更多参考资料

复制代码
https://pan.baidu.com/s/1c1oQItiA7nZxz8Rnl3STpw?pwd=yftc

https://pan.quark.cn/s/dec9e4868381
相关推荐
在屏幕前出油几秒前
04. FastAPI——响应类型
开发语言·后端·python·pycharm·fastapi
小郭学习之路1 分钟前
Qt vs tools的一个编译问题
开发语言·qt
码农4275 分钟前
点评项目深入改造-------日常学习笔记
java·笔记·学习·搜索引擎·全文检索
前进的李工6 分钟前
LangChain使用之Model IO(提示词模版之FewShotPromptTemplate)
开发语言·人工智能·语言模型·langchain·agent
Ivanqhz6 分钟前
寄存器分配的核心函数 allocate
java·开发语言·后端·python·rust
梵得儿SHI6 分钟前
SpringCloud 微服务实战:支付全链路生产级落地(接口对接 + 异步通知 + 订单状态闭环)
spring·spring cloud·微服务·微信支付·支付模块·支付集成·支付系统架构设计
爱吃烤鸡翅的酸菜鱼7 分钟前
Spring Cloud Eureka 服务注册与发现实战详解:从原理到高可用集群搭建
java·spring·spring cloud·eureka
天远云服8 分钟前
驾培系统车辆核验实战:PHP集成天远二手车估值API实现学员车辆信息自动化管理
大数据·开发语言·自动化·php
2501_945424808 分钟前
高性能计算资源调度
开发语言·c++·算法
程序员爱钓鱼9 分钟前
GoWeb开发核心库: net/http深度指南
后端·面试·go