策略模式

简介

定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。

使用场景:

  • 支付方式选择

  • 排序算法选择

  • 压缩算法选择

  • 游戏角色技能

实现要点:

  • 策略接口定义算法

  • 具体策略实现不同算法

  • 上下文持有策略引用

UML

代码示例

  1. 支付策略接口

public interface PaymentStrategy {
    /**
     * 执行支付
     * @param amount 支付金额
     */
    void pay(double amount);
}
  1. 具体策略

public class AliPayPayment implements PaymentStrategy {
    private String account;

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

    @Override
    public void pay(double amount) {
        System.out.println("使用支付宝支付: " + amount + " 元");
        System.out.println("账户: " + account);
        System.out.println("支付成功!");
    }
}
public class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;
    private String name;

    public CreditCardPayment(String cardNumber, String name) {
        this.cardNumber = cardNumber;
        this.name = name;
    }

    @Override
    public void pay(double amount) {
        System.out.println("使用信用卡支付: " + amount + " 元");
        System.out.println("卡号: " + maskCardNumber(cardNumber));
        System.out.println("持卡人: " + name);
        System.out.println("支付成功!");
    }

    private String maskCardNumber(String cardNumber) {
        // 隐藏部分卡号
        if (cardNumber == null || cardNumber.length() < 4) {
            return cardNumber;
        }
        return "****-****-****-" + cardNumber.substring(cardNumber.length() - 4);
    }
}
public class PayPalPayment implements PaymentStrategy {
    private String email;

    public PayPalPayment(String email) {
        this.email = email;
    }

    @Override
    public void pay(double amount) {
        System.out.println("使用PayPal支付: " + amount + " 元");
        System.out.println("邮箱: " + email);
        System.out.println("支付成功!");
    }
}
public class WeChatPayment implements PaymentStrategy {
    private String openId;

    public WeChatPayment(String openId) {
        this.openId = openId;
    }

    @Override
    public void pay(double amount) {
        System.out.println("使用微信支付: " + amount + " 元");
        System.out.println("OpenID: " + openId);
        System.out.println("支付成功!");
    }
}
  1. 策略模式上下文

public class ShoppingCart {
    private PaymentStrategy paymentStrategy;
    private double totalAmount = 0.0;

    /**
     * 设置支付策略
     * @param paymentStrategy 支付策略
     */
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    /**
     * 添加商品
     * @param itemName 商品名称
     * @param price 价格
     */
    public void addItem(String itemName, double price) {
        totalAmount += price;
        System.out.println("添加商品: " + itemName + ", 价格: " + price + " 元");
    }

    /**
     * 执行支付
     * 委托给当前设置的支付策略
     */
    public void checkout() {
        if (paymentStrategy == null) {
            System.out.println("错误: 未设置支付方式!");
            return;
        }
        
        System.out.println("\n=== 结账 ===");
        System.out.println("总金额: " + totalAmount + " 元");
        paymentStrategy.pay(totalAmount);
        System.out.println("================\n");
    }

    /**
     * 获取总金额
     */
    public double getTotalAmount() {
        return totalAmount;
    }
}
  1. 使用方式

public class StrategyPatternTest {
    
    public static void main(String[] args) {
        // 创建购物车
        ShoppingCart cart = new ShoppingCart();
        
        // 添加商品
        cart.addItem("笔记本电脑", 5999.0);
        cart.addItem("无线鼠标", 99.0);
        cart.addItem("机械键盘", 399.0);
        
        System.out.println("购物车总金额: " + cart.getTotalAmount() + " 元\n");
        
        // ==========================================
        // 策略1: 使用信用卡支付
        // ==========================================
        System.out.println("【策略1】信用卡支付");
        PaymentStrategy creditCardStrategy = new CreditCardPayment("1234567890123456", "张三");
        cart.setPaymentStrategy(creditCardStrategy);
        cart.checkout();
        
        // ==========================================
        // 策略2: 使用支付宝支付
        // ==========================================
        System.out.println("【策略2】支付宝支付");
        PaymentStrategy aliPayStrategy = new AliPayPayment("138****8888");
        cart.setPaymentStrategy(aliPayStrategy);
        cart.checkout();
        
        // ==========================================
        // 策略3: 使用微信支付
        // ==========================================
        System.out.println("【策略3】微信支付");
        PaymentStrategy weChatStrategy = new WeChatPayment("wx_id_123456");
        cart.setPaymentStrategy(weChatStrategy);
        cart.checkout();
        
        // ==========================================
        // 策略模式优势演示:
        // 1. 开闭原则:可以轻松添加新的支付方式(如PayPal),无需修改现有代码
        // 2. 运行时切换:可以在运行时动态改变策略
        // 3. 消除条件语句:不需要用 if-else 来选择不同的支付方式
        // ==========================================
    }
}

Last updated

Was this helpful?