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

news/2024/7/7 20:43:44 标签: java, 策略模式, 开发语言

在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中也有广泛的应用。


http://www.niftyadmin.cn/n/5535289.html

相关文章

c++STL中的全排列函数next_permutation详解

cSTL中的全排列函数next_permutation详解 在 C 的 库中,next_permutation 是一个用于计算给定范围内元素的下一个排列的函数。这个函数特别适用于对整数序列或可以比较的元素进行全排列的生成。 参数 first, last:表示范围的迭代器,即要重…

微服务之服务保护策略【持续更新】

文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离(Hystix隔离),每个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU…

深度解析华为仓颉语言

什么是华为仓颉语言? 华为仓颉语言(Huawei Cangjie Language,HCL)是华为公司推出的一种新型编程语言,旨在解决大规模分布式系统开发中的复杂性问题。仓颉语言以高效、简洁和易用为设计目标,特别适用于云计…

6 矩阵相关案例

矩阵计算在CUDA中的应用是并行计算领域的典型场景 ; 矩阵算法题通常涉及线性代数的基础知识,以及对数据结构和算法的深入理解。解决这类问题时,掌握一些核心思想和技巧会非常有帮助。以下是一些常见的矩阵算法题解题思想: 动态规划…

Linux和mysql中的基础知识

cpu读取的指令大部分在内存中(不考虑缓存) 任何程序在运行之前都的加入到内存。 eip->pc指针,指明当前指令在什么位置。 代码大概率是从上往下执行的,基于这样的基本理论。既可以将一部分指令加载到CPU对应的缓存中&#xf…

一文带你入门机器学习回归算法

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

mongdb学习与使用

1. 基础概念 MongoDB简介: MongoDB是一个基于文档的NoSQL数据库,具有高性能、高可用性和易扩展性。数据存储在类似JSON的BSON格式中。 基本术语: Database(数据库): 集合的容器。Collection(集合…

Echarts折线+柱状图的多y轴

实现效果&#xff1a; 代码&#xff1a; <template><div class"test-echart"><div id"barLineChart" ref"barLineChart" :style"barLineStyle"></div></div> </template> <script> // imp…