简介:本文深入解析Java设计模式中的策略模式,从定义、核心思想、应用场景到代码实现,全面阐述其优势与实用性,帮助开发者灵活应对需求变化。
策略模式(Strategy Pattern)是行为型设计模式之一,其核心思想在于将算法或行为封装为独立的对象,使它们可以相互替换。通过定义一个策略接口,并由多个具体策略类实现该接口,客户端可以根据运行时需求动态切换策略,从而避免使用条件语句(如if-else或switch)硬编码业务逻辑。
策略模式适用于以下场景:
假设一个电商系统支持多种支付方式,传统实现可能如下:
public class PaymentProcessor {public void process(String paymentType, double amount) {if ("Alipay".equals(paymentType)) {// 支付宝支付逻辑} else if ("WeChat".equals(paymentType)) {// 微信支付逻辑} // 其他支付方式...}}
问题:新增支付方式需修改PaymentProcessor,违反开闭原则。
策略模式改造:
public interface PaymentStrategy {void pay(double amount);}
}
System.out.println("使用支付宝支付:" + amount + "元");
public class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println(“使用微信支付:” + amount + “元”);
}
}
3. 上下文类:```javapublic class PaymentContext {private PaymentStrategy strategy;public PaymentContext(PaymentStrategy strategy) {this.strategy = strategy;}public void executePayment(double amount) {strategy.pay(amount);}public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}}
客户端使用:
public class Client {public static void main(String[] args) {PaymentContext context = new PaymentContext(new AlipayStrategy());context.executePayment(100.0); // 输出:使用支付宝支付:100.0元context.setStrategy(new WeChatPayStrategy());context.executePayment(100.0); // 输出:使用微信支付:100.0元}}
改造后优势:新增支付方式仅需实现PaymentStrategy接口,无需修改现有代码。
对于简单策略,可使用枚举替代类:
public enum PaymentStrategy {ALIPAY {@Overridepublic void pay(double amount) {System.out.println("支付宝支付:" + amount);}},WECHAT {@Overridepublic void pay(double amount) {System.out.println("微信支付:" + amount);}};public abstract void pay(double amount);}
优点:代码简洁,适合策略固定的场景。
通过函数式接口简化策略实现:
@FunctionalInterfacepublic interface PaymentStrategy {void pay(double amount);}public class Client {public static void main(String[] args) {PaymentStrategy alipay = amount -> System.out.println("支付宝支付:" + amount);alipay.pay(100.0); // 输出:支付宝支付:100.0}}
适用场景:策略逻辑简单且无需维护状态时。
策略模式通过将算法封装为独立对象,实现了行为的高度灵活性和可扩展性。其核心价值在于将变化的部分隔离,使系统更易于维护和扩展。在实际开发中,建议结合具体场景选择实现方式:
未来,随着函数式编程的普及,策略模式与Lambda表达式的结合将更加紧密,开发者可进一步探索如何利用函数式特性简化策略设计。掌握策略模式不仅有助于编写高质量代码,更是提升系统设计能力的关键一步。