恋上蓝花楹

设计模式实战:策略模式让你的代码优雅如诗

在软件开发的漫长旅程中,我们经常会遇到这样的场景:一个功能需要根据不同的情况执行不同的算法或策略。如果用一堆 if-else 来处理,代码很快就会变成难以维护的”意大利面条”。这时候,策略模式就闪亮登场了。

代码与咖啡
优雅的代码,如同一杯精心调制的咖啡

什么是策略模式?

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。策略模式让算法独立于使用它的客户端而变化。

简单来说,策略模式就是把”做什么”和”怎么做”分离开来。客户端只需要知道”做什么”,而”怎么做”则交给具体的策略实现。

实战场景:支付系统

假设我们正在开发一个电商系统,需要支持多种支付方式:支付宝、微信支付、银行卡、信用卡等。如果不用设计模式,代码可能是这样的:

public void pay(String type, BigDecimal amount) {
    if ("alipay".equals(type)) {
        // 支付宝支付逻辑
        System.out.println("使用支付宝支付:" + amount);
    } else if ("wechat".equals(type)) {
        // 微信支付逻辑
        System.out.println("使用微信支付:" + amount);
    } else if ("bank".equals(type)) {
        // 银行卡支付逻辑
        System.out.println("使用银行卡支付:" + amount);
    }
    // 每次新增支付方式都要修改这里...
}

这种写法的问题显而易见:每次新增支付方式都要修改原有代码,违反了开闭原则。而且随着支付方式增多,if-else 会越来越长,可读性越来越差。

用策略模式重构

让我们用策略模式来优雅地重构这段代码:

// 1. 定义策略接口
public interface PaymentStrategy {
    void pay(BigDecimal amount);
}

// 2. 具体策略实现
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(BigDecimal amount) {
        System.out.println("使用支付宝支付:" + amount);
    }
}

public class WechatStrategy implements PaymentStrategy {
    @Override
    public void pay(BigDecimal amount) {
        System.out.println("使用微信支付:" + amount);
    }
}

// 3. 策略上下文
public class PaymentContext {
    private PaymentStrategy strategy;
    
    public void setStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void executePayment(BigDecimal amount) {
        strategy.pay(amount);
    }
}

策略模式的优点

  • 开闭原则:新增策略无需修改现有代码,只需添加新的策略类
  • 单一职责:每个策略类只负责一种算法实现
  • 易于扩展:可以轻松添加新的策略
  • 运行时切换:可以在运行时动态选择策略

实际应用案例

策略模式在实际项目中应用广泛:

  • 排序算法选择:根据数据规模选择快速排序、归并排序等
  • 压缩算法:支持 ZIP、RAR、7Z 等多种压缩格式
  • 路线规划:最短路径、最快路径、避开高速等多种策略
  • 促销活动:满减、折扣、买一送一等不同优惠策略

总结

策略模式是设计模式中最为实用的模式之一。它通过封装变化、面向接口编程,让我们的代码更加灵活、可扩展。当你发现自己又在写长长的 if-else 链时,不妨停下来思考一下:是不是该请策略模式出场了?

记住,好的代码不仅要能运行,更要易于理解和维护。策略模式,让你的代码优雅如诗。

wulilele

我是一名热爱科技与AI的软件工程师。