首页 > 其他分享 >【设计模式】一文搞懂策略模式

【设计模式】一文搞懂策略模式

时间:2024-10-21 18:46:49浏览次数:9  
标签:return 策略 public 算法 orderAmount 搞懂 设计模式 BigDecimal 一文

目录

什么是策略模式

策略模式结构

策略模式的优点和缺点

项目实战

实际场景

代码实现(策略模式+工厂模式)

优惠券折扣金额的策略接口

优惠金额策略

打折

直减

满减

工厂类

环境类

总结


什么是策略模式

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。主要用在有多种算法相似的情况下,避免大量使用 if...else 和 switch-case 所带来的复杂和难以维护的问题。

策略模式结构

  • Strategy 接口定义了一个算法族,它们都实现了strategyMethod () 方法。

  • Context 是使用到该算法族的类,其中的 strategyMethod ()  方法会调用 strategyMethod,setStrategy(Strategy strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。

策略模式的优点和缺点

优点:

  1. 通过使用不同的策略类,避免了在客户端代码中使用大量的 if else 语句。
  2. 可以在运行时选择不同的算法,而不需要修改客户端代码。
  3. 可以通过增加新的策略类来扩展新的算法,而无需修改现有代码。

缺点:

  1. 客户端必须知道所有的策略,并且自行决定使用哪一种策略。
  2. 代码中会产生非常多的策略类,增加策略的维护成本。

项目实战

实际场景

购买商品时候使用的各种类型优惠券(打折、满减、直减)金额计算。

代码实现(策略模式+工厂模式)

优惠券折扣金额的策略接口

public interface CouponCalculationStrategy {

    /**
     * 计算折扣
     *
     * @param template    优惠券模板
     * @param orderAmount 订单金额
     * @return 优惠后金额
     */
    BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount);
}

优惠金额策略

打折
public class DiscountCalculationStrategy implements CouponCalculationStrategy {

    @Override
    public BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount) {
        DiscountCouponDO discountCoupon = (DiscountCouponDO) template;
        return orderAmount.multiply(BigDecimal.valueOf(discountCoupon.getDiscountRate()));
    }
}
直减
public class FixedDiscountCalculationStrategy implements CouponCalculationStrategy {

    @Override
    public BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount) {
        FixedDiscountCouponDO fixedDiscount = (FixedDiscountCouponDO) template;
        return BigDecimal.valueOf(fixedDiscount.getDiscountAmount());
    }
}
满减
public class ThresholdCalculationStrategy implements CouponCalculationStrategy {

    @Override
    public BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount) {
        ThresholdCouponDO thresholdDiscount = (ThresholdCouponDO) template;
        if (orderAmount.compareTo(BigDecimal.valueOf(thresholdDiscount.getThresholdAmount())) >= 0) {
            return BigDecimal.valueOf(thresholdDiscount.getDiscountAmount());
        }
        return BigDecimal.ZERO;
    }
}

工厂类

public class CouponFactory {

    /**
     * 获取优惠券计算策略。
     *
     * @param coupon 基础优惠券模板对象
     * @return 对应的优惠券计算策略
     */
    public static CouponCalculationStrategy getCouponCalculationStrategy(CouponTemplateDO coupon) {
        switch (DiscountTypeEnum.getByType(coupon.getType())) {
            case FIXED_DISCOUNT:
                return new FixedDiscountCalculationStrategy();
            case THRESHOLD_DISCOUNT:
                return new ThresholdCalculationStrategy();
            case DISCOUNT_COUPON:
                return new DiscountCalculationStrategy();
            default:
                throw new IllegalArgumentException("Invalid coupon type");
        }
    }
}

环境类

@Service
public class CouponCalculationService {

    /**
     * 计算优惠金额。
     * 根据传入的优惠券实例和订单金额,选择相应的计算策略,返回最终的优惠金额。
     *
     * @param coupon      具体的优惠券实例
     * @param orderAmount 订单金额
     * @return 计算出的优惠金额
     */
    public BigDecimal calculateDiscount(CouponTemplateDO coupon, BigDecimal orderAmount) {
        CouponCalculationStrategy strategy = CouponFactory.getCouponCalculationStrategy(coupon);
        return strategy.calculateDiscount(coupon, orderAmount);
    }
}

总结

策略模式通过定义一系列可互换的算法,并将它们封装到独立的策略类中,使得算法可以在运行时动态替换,提供了更灵活和可扩展的设计方案。策略模式有效地消除了算法的条件分支语句,使代码更加简洁和清晰。

标签:return,策略,public,算法,orderAmount,搞懂,设计模式,BigDecimal,一文
From: https://blog.csdn.net/qq_62095670/article/details/143117692

相关文章

  • tocaf1的学习日志_两综述一文献
    基于深度学习的目标检测算法研究与应用综述张阳婷张阳婷,黄德启,王东伟,贺佳佳;新疆大学电气工程学院,乌鲁木齐830017摘要:总结基于深度学习的目标检测技术比较两阶段和单阶段网络架构的优缺点分析经典算法的改进策略及应用现状指出未来的研究方向前言:深度学习推动目标检测......
  • 器件(一):一文读懂CoolMOS
    一直想琢磨开关管的器件选型,但一直不知道从哪里下手。最近有幸获得了一些启发,就决定先从材料方面入手,好好聊聊不同材料开关管的器件选型。概念CoolMOS是一种高性能的功率MOSFET(金属-氧化物-半导体场效应晶体管),由英飞凌科技公司(InfineonTechnologies)开发并推向市场,主要使用单......
  • 一文搞懂SaaS应用架构:应用服务、应用结构、应用交互设计
    大家好,我是汤师爷~今天系统性地聊聊SaaS应用架构设计。应用架构概述我们已经完成了SaaS系统的定位分析,明确了系统的目标和核心能力。这为接下来的应用架构设计奠定了基础。应用架构就像整个SaaS系统的骨架,决定了系统的整体结构和各个组件之间的关系。接下来,我们会深入探讨应用......
  • 一文彻底弄清Redis的布隆过滤器
    布隆过滤器(BloomFilter)是一种空间效率极高的数据结构,用于快速判断一个元素是否在集合中。它能够节省大量内存,但它有一个特点:可能存在误判,即可能会认为某个元素存在于集合中,但实际上不存在;而对于不存在的元素,它保证一定不会误判。布隆过滤器适合在对存储空间要求极为严格,同时能接......
  • Django的MVT设计模式
    经典的MVC设计模式及其有点MVC即Model-View-Controller(模型-视图-控制器),是经典的软件开发设计模式***Model(模型)**简而言之即数据模型。模型不是数据本身(比如数据库里的数据),而是抽象的描述数据的构成和逻辑关系。通常模型包括了数据表的各个字段(比如人的年龄和出生日期......
  • 一文读懂K8S的PV和PVC以及实践攻略
    一文读懂K8S的PV和PVC以及实践攻略Kubernetes(K8S)作为当前云原生和微服务架构的首选平台,凭借其强大的容器编排和管理能力,迅速成为一线大厂分布式平台的标配技术。在Kubernetes中,持久化存储是一个核心问题,特别是对于需要持久化数据的应用来说。为了实现数据的持久化存储,Kuber......
  • 面向对象与设计模式第一课:深入理解OOP
    第三章:面向对象与设计模式第一课:深入理解OOP面向对象编程(OOP)是一种编程范式,它将程序结构视为由对象组成,促进了代码的重用性和可维护性。在这一课中,我们将深入分析OOP的四个基本特性:封装、继承、多态和抽象,并提供相应的示例与实践。1.OOP基本特性1.1封装封装是OOP的核心......
  • 05 设计模式-创造型模式-原型模式
    原型模式(PrototypePattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在......
  • 【一文理解】下采样与上采样区别
    目录下采样上采样注意下采样原理对图像进行1/n下采样,原图像分辨率为H*W,下采样分辨率变为(H/n)*(W/n)作用压缩FeatureMap降维减少提取特征降低模型计算量避免模型过拟合本质过滤无关信息,保留关键信息方法主要通过是池化层或卷积层进行下采样采用stride为2的池化......
  • JavaScript事件循环:一杯咖啡的时间,搞懂主线程都经历了什么?
    我们今天来聊聊JavaScript事件循环。虽然这个词听起来很高深,但你可以把它想象成一个奶茶店里排队买奶茶的过程。主线程就像奶茶店的唯一一个店员,任务就是那些排队的订单,而JavaScript的事件循环就是这个店员处理订单的工作方式。先看代码,咱们慢慢聊:console.log('1:进店......