Java之使用策略模式替代 if-else

在Java中,通常情况下 if-else 语句用于根据不同条件执行不同的逻辑。而策略模式则是一种设计模式,它允许在运行时选择算法的行为。

策略模式的主要思想是将算法封装成独立的对象,使得它们可以相互替换,使得算法的变化独立于使用算法的客户。这种模式可以帮助我们避免使用大量的

if-else 或者 switch-case 结构,从而增强代码的灵活性和可维护性。

使用策略模式替代 if-else

假设我们有一个根据不同类型的用户给予不同折扣的需求。通常的实现可能会使用 if-else 结构来根据用户类型执行不同的逻辑,例如:

java 复制代码
java
public class DiscountCalculator {

    public double calculateDiscount(User user, double purchaseAmount) {
        if (user.getType().equals(UserType.REGULAR)) {
            return purchaseAmount * 0.1; // 10% discount for regular users
        } else if (user.getType().equals(UserType.PREMIUM)) {
            return purchaseAmount * 0.2; // 20% discount for premium users
        } else if (user.getType().equals(UserType.GUEST)) {
            return 0; // no discount for guest users
        }
        return 0;
    }
}

这种方式虽然简单,但是随着用户类型的增加或者逻辑的变更,可能会导致 if-else 结构的增加和修改,不利于代码的扩展和维护。

使用策略模式重构
下面是如何使用策略模式重构上述例子:

定义策略接口:

java 复制代码
public interface DiscountStrategy {
    double applyDiscount(double purchaseAmount);
}

实现具体的策略类:
java

java 复制代码
public class RegularDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double purchaseAmount) {
        return purchaseAmount * 0.1; // 10% discount for regular users
    }
}

public class PremiumDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double purchaseAmount) {
        return purchaseAmount * 0.2; // 20% discount for premium users
    }
}

public class GuestDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double purchaseAmount) {
        return 0; // no discount for guest users
    }
}

使用策略模式:
java

java 复制代码
public class DiscountCalculator {

    private DiscountStrategy discountStrategy;

    public DiscountCalculator(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double calculateDiscount(double purchaseAmount) {
        return discountStrategy.applyDiscount(purchaseAmount);
    }
}

客户端使用:
java

java 复制代码
public class Main {
    public static void main(String[] args) {
        User user = new User(UserType.REGULAR); // or UserType.PREMIUM, UserType.GUEST
        DiscountCalculator calculator = new DiscountCalculator(new RegularDiscountStrategy());
        double discount = calculator.calculateDiscount(100.0);
        System.out.println("Discount applied: " + discount);
    }
}

优势和总结

通过策略模式,我们将不同的算法(即折扣计算逻辑)封装到独立的策略类中,客户端根据需要选择具体的策略对象。这种方式避免了大量的 if-else

结构,使得代码更加清晰、扩展性更好,同时也符合面向对象设计的开闭原则(对扩展开放,对修改关闭)。

策略模式适用于那些需要在运行时根据不同情况选择不同算法的场景,是一种常见的行为型设计模式,在Java中也有广泛的应用。

相关推荐
云边有个稻草人4 分钟前
思维与算法共舞:AIGC语言模型的艺术与科学
开发语言·算法·什么是语言模型?·多任务学习与多模态生成·客户服务与聊天机器人·自适应生成与定制化文本·预训练与微调
pzx_0019 分钟前
【深度学习】自定义实现DataSet和DataLoader
开发语言·人工智能·python·深度学习·算法
Tracy-224 小时前
啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!
java·spring
未定义.2215 小时前
Java设计模式实战:策略模式在SimUDuck问题中的应用
java·设计模式·策略模式
HelloRevit5 小时前
Next.js 快速启动模板
开发语言·javascript·ecmascript
爱叨叨的程序狗5 小时前
策略模式随笔~
策略模式
码熔burning6 小时前
【NIO番外篇】之组件 Channel
java·nio·channel
卡尔曼的BD SLAMer7 小时前
问题 | 针对SSM(Spring + Spring MVC + MyBatis)框架的去Spring MVC强化版学习路线
java·spring·mvc·mybatis
春生野草7 小时前
0413-多态、Object类方法、访问权限修饰符、装箱拆箱、128陷阱
java·开发语言
烁3477 小时前
每日一题(小白)暴力娱乐篇25
java·数据结构·算法·娱乐