设计模式-策略模式

发布时间:2026/5/26 10:42:10

设计模式-策略模式 策略模式(Strategy Pattern)详解一、模式概述策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。就像出行方式的选择——去机场可以选择打车、地铁、公交或自驾,每种方式都是一个策略,你可以根据情况动态选择。二、模式结构1. 核心角色text┌─────────────────┐ ┌─────────────────┐ │ Context │──────────│ Strategy │ │ (上下文) │ has-a │ (策略接口) │ └─────────────────┘ └────────┬────────┘ │ ┌──────────────────┼──────────────────┐ │ │ │ ┌───────┴───────┐ ┌───────┴───────┐ ┌───────┴───────┐ │ConcreteStrategyA│ │ConcreteStrategyB│ │ConcreteStrategyC│ │ (具体策略A) │ │ (具体策略B) │ │ (具体策略C) │ └───────────────┘ └───────────────┘ └───────────────┘2. 角色职责角色名称职责Context上下文维护对策略对象的引用,可定义接口让策略访问其数据Strategy策略接口定义所有支持的算法的公共接口ConcreteStrategy具体策略实现策略接口,提供具体的算法实现三、基础实现示例示例:支付方式选择java// 1. 策略接口 interface PaymentStrategy { void pay(double amount); } // 2. 具体策略:支付宝支付 class AlipayStrategy implements PaymentStrategy { private String account; public AlipayStrategy(String account) { this.account = account; } @Override public void pay(double amount) { System.out.println("使用支付宝账户 " + account + " 支付 " + amount + " 元"); System.out.println("支付宝支付成功,享受了随机立减优惠"); } } // 3. 具体策略:微信支付 class WechatPayStrategy implements PaymentStrategy { private String openId; public WechatPayStrategy(String openId) { this.openId = openId; } @Override public void pay(double amount) { System.out.println("使用微信支付(openId: " + openId + ") 支付 " + amount + " 元"); System.out.println("微信支付成功,获得积分奖励"); } } // 4. 具体策略:银行卡支付 class CreditCardStrategy implements PaymentStrategy { private String cardNumber; private String cvv; private String expiryDate; public CreditCardStrategy(String cardNumber, String cvv, String expiryDate) { this.cardNumber = cardNumber; this.cvv = cvv; this.expiryDate = expiryDate; } @Override public void pay(double amount) { System.out.println("使用信用卡 " + cardNumber + " 支付 " + amount + " 元"); System.out.println("银行卡支付成功,已发送扣款短信"); } } // 5. 具体策略:现金支付 class CashStrategy implements PaymentStrategy { private double cashReceived; public CashStrategy(double cashReceived) { this.cashReceived = cashReceived; } @Override public void pay(double amount) { if (cashReceived = amount) { double change = cashReceived - amount; System.out.println("使用现金支付 " + amount + " 元,收 " + cashReceived + " 元,找零 " + change + " 元"); } else { System.out.println("现金不足,还需 " + (amount - cashReceived) + " 元"); } } } // 6. 上下文:订单 class Order { private String orderId; private double amount; private PaymentStrategy paymentStrategy; public Order(String orderId, double amount) { this.orderId = orderId; this.amount = amount; } // 设置支付策略(运行时动态选择) public void setPaymentStrategy(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } // 执行支付 public void checkout() { if (paymentStrategy == null) { throw new IllegalStateException("请先选择支付方式"); } System.out.println("订单 " + orderId + " 金额: " + amount + " 元"); paymentStrategy.pay(amount); System.out.println("支付完成\n"); } } // 客户端使用 public class PaymentClient { public static void main(String[] args) { // 创建订单 Order order1 = new Order("ORD001", 299.0); Order order2 = new Order("ORD002", 520.0); Order order3 = new Order("ORD003", 88.5); // 根据不同场景选择不同策略 System.out.println("=== 场景1: 用户选择支付宝支付 ==="); order1.setPaymentStrategy(new AlipayStrategy("user@alipay.com")); order1.checkout(); System.out.println("=== 场景2: 用户选择微信支付 ==="); order2.setPaymentStrategy(new WechatPayStrategy("wx_openid_12345")); order2.checkout(); System.out.println("=== 场景3: 用户选择信用卡支付 ==="); order3.setPaymentStrategy(new CreditCardStrategy("1234-5678-9012-3456", "123", "12/25")); order3.checkout(); System.out.println("=== 场景4: 动态切换策略 ==="); Order order4 = new Order("ORD004", 150.0); // 先选支付宝 order4.setPaymentStrategy(new AlipayStrategy("user@alipay.com")); order4.checkout(); // 改变主意,换成现金 order4.setPaymentStrategy(new CashStrategy(200.0)); order4.checkout(); } }四、策略模式的核心优势1.消除条件判断不使用策略模式:javaclass OrderService { public void processPayment(String paymentMethod, double amount) { if ("alipay".equals(paymentMethod)) { // 支付宝支付逻辑 System.out.println("支付宝支付: " + amount); System.out.println("调用支付宝API"); System.out.println("处理支付宝回调"); } else if ("wechat".equals(paymentMethod)) { // 微信支付逻辑 System.out.println("微信支付: " + amount); System.out.println("调用微信API"); System.out.println("处理微信回调"); } else if ("creditcard".equals(paymentMethod)) { // 信用卡支付逻辑 System.out.println("信用卡支付: " + amount); System.out.println("调用银行API"); System.out.println("发送短信验证"); } else { throw new IllegalArgumentException("不支持的支付方式"); } } } // 问题:每次新增支付方式都要修改这个方法,违反开闭原则使用策略模式:javainterface PaymentStrategy { void pay(double amount); } class OrderService { private PaymentStrategy paymentStrategy; public void setPaymentStrategy(PaymentStrategy strategy) { this.paymentStrategy = strategy; } public void processPayment(double amount) { paymentStrategy.pay(amount); // 无需条件判断 } } // 优点:新增支付方式只需新增类,无需修改现有代码2.算法族封装策略模式将相关算法封装成独立的类,便于理解、测试和维护。五、实际应用场景1.电商促

相关新闻