目 录CONTENT

文章目录

策略模式

小王同学
2023-12-24 / 0 评论 / 0 点赞 / 56 阅读 / 0 字

策略模式

在软件开发中,Controller层经常充斥着复杂的条件逻辑,尤其是大量的 if...else...语句。这不仅使代码难以阅读和维护,而且也违背了开闭原则(OCP)。本文将向你展示如何使用策略模式来重构这种臃肿的条件逻辑,让你的Controller层更加优雅和灵活。

什么是策略模式?

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

策略模式主要由这三个角色组成,环境角色(Context)、抽象策略角色(Strategy)和具体策略角色(ConcreteStrategy)。

  • 环境角色(Context):持有一个策略类的引用,提供给客户端使用。
  • 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略角色(ConcreteStrategy):包装了相关的算法或行为。

示例图如下:
20181111152930787.png

为什么使用策略模式?

在Controller中,我们通常根据不同的请求参数来执行不同的业务逻辑。随着业务的发展,if...else...语句会变得越来越复杂,难以管理。使用策略模式可以将这些逻辑分散到不同的类中,每个类处理一种特定的逻辑。这样不仅使得代码更加清晰,也更容易扩展。

如何实现策略模式?

让我们通过一个简单的例子来看看如何将Controller中的 if...else...语句重构为策略模式。假设我们有一个电商平台,根据用户的不同会员等级计算折扣。

重构前的Controller

public class DiscountController {
    public BigDecimal calculateDiscount(String memberType, BigDecimal price) {
        if ("NORMAL".equals(memberType)) {
            // 普通会员不打折
            return price;
        } else if ("SILVER".equals(memberType)) {
            // 银牌会员打9折
            return price.multiply(new BigDecimal("0.9"));
        } else if ("GOLD".equals(memberType)) {
            // 金牌会员打8折
            return price.multiply(new BigDecimal("0.8"));
        } else {
            throw new IllegalArgumentException("Unknown member type: " + memberType);
        }
    }
}

使用策略模式重构

定义策略接口

public interface DiscountStrategy {
    BigDecimal applyDiscount(BigDecimal price);
}

实现策略类

public class NormalDiscountStrategy implements DiscountStrategy {
    @Override
    public BigDecimal applyDiscount(BigDecimal price) {
        // 普通会员不打折
        return price;
    }
}

public class SilverDiscountStrategy implements DiscountStrategy {
    @Override
    public BigDecimal applyDiscount(BigDecimal price) {
        // 银牌会员打9折
        return price.multiply(new BigDecimal("0.9"));
    }
}

public class GoldDiscountStrategy implements DiscountStrategy {
    @Override
    public BigDecimal applyDiscount(BigDecimal price) {
        // 金牌会员打8折
        return price.multiply(new BigDecimal("0.8"));
    }
}

策略工厂

public class DiscountStrategyFactory {
    public static DiscountStrategy getDiscountStrategy(String memberType) {
        switch (memberType) {
            case "NORMAL":
                return new NormalDiscountStrategy();
            case "SILVER":
                return new SilverDiscountStrategy();
            case "GOLD":
                return new GoldDiscountStrategy();
            default:
                throw new IllegalArgumentException("Unknown member type: " + memberType);
        }
    }
}

重构后的Controller

public class DiscountController {
    public BigDecimal calculateDiscount(String memberType, BigDecimal price) {
        DiscountStrategy strategy = DiscountStrategyFactory.getDiscountStrategy(memberType);
        return strategy.applyDiscount(price);
    }
}

优势总结

通过上述重构,我们将具体的打折逻辑从Controller中分离出去,每种会员类型的打折策略都有自己的类来实现。这样做有几个优点:

  1. 可维护性:新的设计使得每个策略都是独立的,易于理解和维护。
  2. 可扩展性:如果需要添加新的会员类型,我们只需要添加一个新的策略类,而不需要修改现有的代码。
  3. 可测试性:每个策略都可以独立地进行单元测试。

结语

策略模式是一种非常有用的设计模式,特别是在处理复杂的条件逻辑时。它不仅帮助我们保持代码的整洁,还提高了代码的可维护性和可扩展性。下次当你发现自己在Controller中写了太多的 if...else...语句时,不妨考虑使用策略模式来优化它。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区