首页 > 其他分享 >深度学习设计模式之策略模式

深度学习设计模式之策略模式

时间:2024-08-22 08:54:07浏览次数:8  
标签:settlement 策略 double ShoppingStrategyContext 模式 算法 深度 设计模式 public

文章目录


前言

策略模式定义一系列算法,封装每个算法,并使它们可以互换。


一、介绍

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

二、特点

  • 算法封装:策略模式将算法封装在独立的策略类中,使得算法可以在运行时更换。

  • 接口统一:所有策略类实现同一个接口或继承自同一个抽象类,确保它们具备一致的方法签名。

  • 动态替换:可以在运行时根据不同的条件或配置动态选择使用不同的策略。

  • 简化客户端代码:客户端通过接口与策略对象交互,不需要了解具体的算法实现细节。

  • 单一职责原则:每个策略类只关注一种算法的实现,符合单一职责原则。

三、详细介绍

1.核心组成

  • Strategy(策略接口):定义所有支持的算法的公共接口。

  • ConcreteStrategy(具体策略类):实现Strategy接口,提供具体的算法实现。

  • Context(上下文环境):使用策略接口与具体的策略类交互,持有一个策略对象的引用。

在这里插入图片描述

2.代码示例

策略接口

/**
 * 购物策略类
 */
public interface ShoppingStrategy {

    /**
     * 结算
     * @param commodityPrice
     * @return
     */
    double settlement(double commodityPrice);

}

具体策略类

/**
 * 具体策略
 * 优惠券
 */
public class CouponStrategy implements ShoppingStrategy{

    private double coupon;

    /**
     * 优惠券价格
     * @param coupon
     */
    public CouponStrategy(double coupon){
        this.coupon = coupon;
    }

    @Override
    public double settlement(double commodityPrice) {
        return commodityPrice - coupon;
    }
}

/**
 * 打折
 */
public class DiscountStrategy implements ShoppingStrategy{

    /**
     * 折扣
     */
    private double discount;

    public DiscountStrategy(double discount){
        this.discount = discount;
    }

    @Override
    public double settlement(double commodityPrice) {
        return commodityPrice * discount;
    }
}
/**
 * 无折扣
 */
public class NoDiscountStrategy implements ShoppingStrategy{
    @Override
    public double settlement(double commodityPrice) {
        return commodityPrice;
    }
}

上下文

/**
 * 上下文
 */
public class ShoppingStrategyContext {

    private ShoppingStrategy shoppingStrategy;

    public ShoppingStrategyContext(ShoppingStrategy shoppingStrategy){
        this.shoppingStrategy = shoppingStrategy;
    }

    /**
     * 结算
     * @param price
     * @return
     */
    public double settlement(double price){
       return shoppingStrategy.settlement(price);
    }

}

测试

/**
 * 测试类
 */
public class StrategyTest {
    public static void main(String[] args) {
        ShoppingStrategyContext shoppingStrategyContext1 = new ShoppingStrategyContext(new NoDiscountStrategy());
        double settlement = shoppingStrategyContext1.settlement(500);
        System.out.println("无折扣价格结算为:"+settlement);

        ShoppingStrategyContext shoppingStrategyContext2 = new ShoppingStrategyContext(new DiscountStrategy(0.7));
        double settlement2 = shoppingStrategyContext2.settlement(500);
        System.out.println("打折价格结算为:"+settlement2);

        ShoppingStrategyContext shoppingStrategyContext3 = new ShoppingStrategyContext(new CouponStrategy(100));
        double settlement3 = shoppingStrategyContext3.settlement(500);
        System.out.println("使用优惠券结算为:"+settlement3);

    }
}

结果
在这里插入图片描述

3.优缺点

优点

  • 满足开闭原则,当增加新的具体策略略时,不需要修改上 下文类的代码,上下文就可以引用新的具体策略的实例。

  • 避免使用多重条件判断,如果不用策略模式可能会使用多重条件语句不利于维护,和工厂模式的搭配使用可以很好地消除代码if-else的多层嵌套。

缺点

  • 策略类数量会增多,每个策略都是一个类,复用的可能性很小。

  • 对外暴露了类所有的行为和算法,行为过多导致策略类膨胀。

4.使用场景

  1. 当需要在运行时根据不同的条件选择使用不同的算法或行为时。
  2. 当需要避免使用大量的条件语句来决定使用哪个算法时。
  3. 当需要使算法的变化独立于使用算法的客户时。
  4. 当需要让客户能够定义一系列行为中的一个作为算法时。

总结

策略模式在实际开发中非常有用,特别是在需要根据不同的业务规则动态选择算法的场景中。它提高了代码的灵活性和可扩展性,使得算法的变化不会影响到使用算法的客户。

标签:settlement,策略,double,ShoppingStrategyContext,模式,算法,深度,设计模式,public
From: https://blog.csdn.net/G_whang/article/details/141370792

相关文章

  • 深度解析:实验室超声波清洗机频率可调功能及其优化应用
    市场上有多种类型的超声波清洗机,其中一些确实支持频率可调功能,而另一些则可能固定频率运行。最近经常碰到客户咨询实验室超声波清洗机的频率可调功能,因为各种实验的不同和清洗物件的不同,使用的频率也是不一样的。但是很多客户对于频率可调的理解有一定的误区。所谓的频率可调......
  • Python——常用行为模式
    行为模式(BehavioralDesignPatterns)主要解决的是对象之间的职责划分与协作问题。这类模式通过定义对象间的通信方式、责任分配和行为组织,帮助构建可扩展、灵活的系统,并且通过减少耦合和提高复用性来优化系统行为。常见的行为模式有:责任链模式(ChainofResponsibility)命......
  • TypeScript深度揭秘:Map的全方位详解、作用、特点、优势及实战应用和高级应用
            在TypeScript的广阔世界里,Map对象无疑是一个强大的存在,它提供了灵活且高效的键值对存储机制。今天,我们就来一场轻松而严谨的探秘之旅,全方位解析TypeScript中Map的定义、作用、特点、优势,并通过实战代码示例,带你领略Map的无穷魅力。引言Map是TypeScript(以及Ja......
  • 深入理解命令模式:设计模式中的行为型模式解析
    深入理解命令模式:设计模式中的行为型模式解析1.引言设计模式是软件开发中一种经过实践验证的、解决常见问题的方案。行为型设计模式关注对象间的职责分配和通信方式。命令模式(CommandPattern)作为一种重要的行为型模式,主要用于将请求封装成对象,从而将请求的发起者和处理......
  • 2025秋招书籍推荐:《深度学习的数学理论》——揭示深度学习背后的数学逻辑
    近年来,随着深度学习在图像识别、自然语言处理等领域的突破性进展,越来越多的研究者和开发者投入到这个领域。然而,尽管深度学习在实践中取得了显著的成功,其背后的理论机制仍然让很多人感到迷惑。这就是为什么我今天想向大家推荐一本书——《深度学习的数学理论》(Mathematical......
  • Spring Boot实战:使用模板方法模式优化数据处理流程
    概述在软件开发过程中,我们经常需要处理各种各样的数据,这些数据可能来自不同的源,比如数据库、文件系统或者外部API等。尽管数据来源不同,但很多情况下处理这些数据的步骤是相似的:读取数据、清洗数据、转换数据格式、存储结果等。为了提高代码的复用性和可维护性,我们可以利用设计......
  • 探索Kubernetes:Java微服务的8步深度指南
    ......
  • 设计模式-责任链模式
    概述责任链模式也是一种行为型的设计模式,它允许按照设定的规则处理事件,顺序执行直到有处理者可以处理这个事件为止,这样的设计模式可以让任务的发出者和任务的处理者没有直接的联系,减少依赖关系,主要由处理者和处理关系组成,以下的例子可以看出。例子:在软件开发中,一般一个任务......
  • 更快更强,SLS 推出高性能 SPL 日志查询模式
    作者:无哲引言随着数字化进程的持续深化,可观测性一直是近年来非常火热的话题,在可观测的三大支柱Log/Trace/Metric中,日志(Log)数据一般是最为常见的,企业迈向可观测性的第一步,也往往始于日志数据的采集上云。日志完成收集后,最直接的需求就是从海量日志数据中检索分析出有价值的信息......
  • NAT地址转换中的PAT(地址复用)模式
    简介         在数据进行传输时,必要经过公网IP才能够传到其他地方(除了局域网),在局域网中想要将数据进行传输到外网,又不浪费公有IP的前提下,NAT地址转换应运而生。    NAT地址转换分为静态地址转换,动态地址转换,以及PTA地址转换,前两种只能一对一,也就说一......