在Java中如何实现策略模式

策略模式通过定义支付接口和多种实现类,使算法可互换且不影响客户端;上下文类动态切换策略,新增方式无需修改代码,符合开闭原则,提升灵活性与维护性。

策略模式是一种行为设计模式,它允许在运行时选择算法或行为。在Java中实现策略模式,关键是将不同的算法封装成独立的类,并使它们可以互相替换,而不会影响使用算法的客户端。

定义策略接口

首先定义一个策略接口,声明所有支持的算法共有的操作:

public interface PaymentStrategy {
    void pay(double amount);
}

实现具体策略类

然后创建多个实现该接口的具体策略类,每个类代表一种支付方式:

public class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;
    
    public CreditCardPayment(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    @Override
    public void pay(double amount) {
        System.out.println("使用信用卡 " + cardNumber + " 支付 " + amount + " 元");
    }
}

public class AlipayPayment implements PaymentStrategy {
    private String account;

    public AlipayPayment(String account) {
        this.account = account;
    }

    @Override
    public void pay(double amount) {
        System.out.println("使用支付宝账号 " + account + " 支付 " + amount + " 元");
    }
}

使用上下文管理策略

创建一个上下文类,用于持有当前策略对象,并在运行时切换策略:

public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    // 设置当前使用的支付策略
    public void setPaymentStrategy(PaymentStrategy strategy) {
        this.paymentStrategy = strategy;
    }

    // 执行支付
    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();

        // 用户选择信用卡支付
        cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456"));
        cart.checkout(299.9);

        // 切换为支付宝支付
        cart.setPaymentStrategy(new AlipayPayment("user@example.com"));
        cart.checkout(150.0);
    }
}

输出结果:

使用信用卡 1234-5678-9012-3456 支付 299.9 元
使用支付宝账号 user@example.com 支付 150.0 元

基本上就这些。通过策略模式,新增支付方式不需要修改现有代码,只需添加新的实现类,符合开闭原则,也让代码更灵活、易于维护。