Java案例中的策略模式怎么写?

wen java案例 5

Java策略模式案例详解

策略模式是一种行为设计模式,它允许在运行时选择算法的行为,我将通过一个完整的案例来展示如何实现策略模式。

Java案例中的策略模式怎么写?

基础结构

策略模式包含三个核心角色:

  • 策略接口:定义所有策略的共同方法
  • 具体策略类:实现具体的算法
  • 上下文类:维护策略对象的引用

完整案例:支付系统

假设我们要实现一个支付系统,支持多种支付方式(支付宝、微信、银行卡)。

1 定义策略接口

// 支付策略接口
public interface PaymentStrategy {
    void pay(double amount);
    String getPaymentMethod();
}

2 实现具体策略类

// 支付宝支付
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用支付宝支付:" + amount + "元");
        // 实际的支付宝支付逻辑
    }
    @Override
    public String getPaymentMethod() {
        return "支付宝";
    }
}
// 微信支付
public class WechatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用微信支付:" + amount + "元");
        // 实际的微信支付逻辑
    }
    @Override
    public String getPaymentMethod() {
        return "微信支付";
    }
}
// 银行卡支付
public class BankCardStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用银行卡支付:" + amount + "元");
        // 实际的银行卡支付逻辑
    }
    @Override
    public String getPaymentMethod() {
        return "银行卡";
    }
}

3 创建上下文类

// 支付上下文
public class PaymentContext {
    private PaymentStrategy strategy;
    public PaymentContext() {
        // 默认使用支付宝
        this.strategy = new AlipayStrategy();
    }
    // 设置支付策略
    public void setPaymentStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }
    // 执行支付
    public void executePayment(double amount) {
        if (strategy == null) {
            throw new IllegalStateException("请先设置支付方式");
        }
        System.out.println("当前支付方式:" + strategy.getPaymentMethod());
        strategy.pay(amount);
    }
}

4 使用示例

public class StrategyPatternDemo {
    public static void main(String[] args) {
        // 创建支付上下文
        PaymentContext paymentContext = new PaymentContext();
        // 使用支付宝支付
        paymentContext.setPaymentStrategy(new AlipayStrategy());
        paymentContext.executePayment(100.0);
        System.out.println("-------------------");
        // 切换到微信支付
        paymentContext.setPaymentStrategy(new WechatPayStrategy());
        paymentContext.executePayment(200.0);
        System.out.println("-------------------");
        // 使用银行卡支付
        paymentContext.setPaymentStrategy(new BankCardStrategy());
        paymentContext.executePayment(300.0);
    }
}

进阶版:带工厂模式的策略模式

// 策略工厂
public class PaymentStrategyFactory {
    private static final Map<String, PaymentStrategy> strategies = new HashMap<>();
    static {
        strategies.put("alipay", new AlipayStrategy());
        strategies.put("wechat", new WechatPayStrategy());
        strategies.put("bankcard", new BankCardStrategy());
    }
    public static PaymentStrategy getStrategy(String type) {
        PaymentStrategy strategy = strategies.get(type.toLowerCase());
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的支付方式:" + type);
        }
        return strategy;
    }
}
// 使用示例
public class FactoryStrategyDemo {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();
        // 通过工厂获取策略
        context.setPaymentStrategy(PaymentStrategyFactory.getStrategy("wechat"));
        context.executePayment(150.0);
    }
}

使用Lambda简化(Java 8+)

// 使用函数式接口简化
public class LambdaStrategyDemo {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();
        // 使用Lambda表达式直接定义策略
        PaymentStrategy vipStrategy = amount -> 
            System.out.println("VIP会员支付:" + amount * 0.9 + "元(9折优惠)");
        context.setPaymentStrategy(vipStrategy);
        context.executePayment(500.0);
    }
}

最佳实践建议

  1. 何时使用策略模式

    • 需要在不同时间应用不同的业务规则
    • 系统有很多相似的类,仅行为不同
    • 需要避免使用多重条件语句
  2. 注意事项

    • 客户端必须了解不同的策略
    • 策略类数量可能过多
    • 考虑使用享元模式策略对象
  3. 与其他模式结合

    • 结合工厂模式创建策略对象
    • 结合单例模式管理策略实例
    • 结合模板方法处理共同逻辑

这就是一个完整的Java策略模式案例,从基础到进阶,覆盖了实际开发中常见的场景。

抱歉,评论功能暂时关闭!