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 小时前
Hot100中的:贪心专题
java·数据结构·算法
myloveasuka4 小时前
Java与C++多态访问成员变量/方法 对比
java·开发语言·c++
2301_821700534 小时前
C++编译期多态实现
开发语言·c++·算法
Andya_net4 小时前
Spring | @EventListener事件机制深度解析
java·后端·spring
奥地利落榜美术生灬5 小时前
c++ 锁相关(mutex 等)
开发语言·c++
xixihaha13245 小时前
C++与FPGA协同设计
开发语言·c++·算法
lang201509285 小时前
18 Byte Buddy 进阶指南:解锁 `@Pipe` 注解,实现灵活的方法转发
java·byte buddy
重庆小透明5 小时前
【java基础篇】详解BigDecimal
java·开发语言
ID_180079054735 小时前
模拟1688商品详情的Python API实现,返回符合风格的JSON数据
开发语言·python·json
小小怪7505 小时前
C++中的函数式编程
开发语言·c++·算法