摸索设计模式的魅力:从策略模式看软件设计的智慧-灵活应对变化的艺术

成就一亿技术达人-策略模式


设计模式专栏:http://t.csdnimg.cn/U54zu


引言

     策略模式是一种设计理念,它允许开发者定义一族算法,将每一个算法封装起来,并且让它们可以相互替换。这种模式让算法的变化独立于使用算法的客户端,即程序的其他部分。在软件设计中,策略模式扮演着至关重要的角色,它解决了应对代码层面行为变化的需求,同时提升了系统的灵活性和可维护性。

    在面对业务逻辑中频繁更迭的功能或是需要应对未来变动的模块时,通常的编程实践可能导致代码中的条件判断和分支语句迅速增长。这种硬编码的处理逻辑易于造成代码的脆弱性,也增加了代码维护的难度。通过实施策略模式,我们将具体行为抽象为独立的策略类,并通过上下文环境来动态选择具体执行哪一个策略,这为复杂和多变的功能提供了简洁的管理方式。

    本文即将探讨的不仅仅是策略模式的理论层面,更将深入其实践价值,阐述如何将策略模式应用到具体的编程问题中去。我们会通过实际示例理解策略模式如何促进代码重用、简化单元测试,并提供一个更加模块化的代码结构。随着对策略模式的应用,你将发现它是如何让你的代码变得更加生动动态、易于扩展和维护,同时保持了代码的简洁性和清晰的逻辑分离。让我们一起深入挖掘策略模式,保证你的软件设计面对未来的各种挑战时始终处于前沿。

目录

  • 一、简介
  • 二、组成
  • 三、应用场景
  • 四、优缺点
  • 五、最佳实践与使用注意事项
  • 六、与其他模式的比较
  • 七、策略模式的实际案例
    • 7.1 背景介绍
    • 7.2 策略模式实现
  • 八、总结

一、简介

     在软件工程中,策略模式是一种行为设计模式,它使得一组算法能够被封装成策略对象,并在运行时,依据需求进行互换使用。这一模式的核心思想是定义一系列的算法,把它们一个个封装起来,并使它们可以相互替换。策略模式的主要目的是将算法的使用与算法的实现分离开来,提供一种机制来选择不同的算法或行为。

     在策略模式中,客户端通常持有一个指向策略对象的引用,并不直接实现算法逻辑。替代地,客户端将算法的执行委托给策略对象。策略模式通常包含三个关键部分:上下文(Context)、策略接口(Strategy Interface)以及一系列实现了该接口的具体策略类(Concrete Strategies)。

     策略模式支持代码的解耦和行为封装,因为上下文类并不需要知道它所使用策略的具体细节。策略模式的实施确保了编码的灵活性和扩展性,通过对不同策略对象的切换,同一个上下文可以执行不同的操作,而无需修改上下文本身的代码。这样的设计使得新的策略能够很容易加入或从系统中移除,从而符合开闭原则——软件实体应该对扩展开放,对修改封闭。

二、组成

     策略模式主要由三个角色组成:上下文(Context)、策略接口(Strategy Interface)和具体策略类(Concrete Strategy classes)。下面将详细介绍每个角色及其交互方式。

策略模式结构示意图

 1. 上下文(Context):
    上下文是策略模式中的一个核心类,它是客户端直接交互对象。上下文通常定义了一种需要多样化算法或行为的操作。为了实现这些行为的动态变化,上下文维护了一个对策略接口的引用。它不执行策略算法,而是将工作委托给连接到的策略对象。上下文可能提供一个设置器(setter)或构造器,以便在运行时切换策略对象。

 2. 策略接口(Strategy Interface):
    策略接口定义了所有支持算法或行为的公共接口。通常,它是由一个抽象类或一个接口表示,它声明了一个或多个方法供具体策略类实现。这个接口为上下文类和具体策略类之间提供了一个契约。所有的算法都遵循相同的接口,这让它们在上下文中可以互换使用。

 3. 具体策略类(Concrete Strategy classes):
    一组策略类实现了策略接口,提供具体的行为实现。每个具体策略类都封装了一种特定的算法或行为逻辑。这些类是策略模式的实际执行者,上下文通过策略接口与它们通信,而不必了解具体的策略实现。当上下文的行为需求发生变化时,可以替换使用不同的具体策略对象,而无需更改上下文类的代码。

三、应用场景

     策略模式是一种适用于算法家族和业务规则需要灵活变化场景的设计模式。它特别有用在以下情形中:

 1. 多种类似算法的选择:当我们的系统中存在多种算法,并且它们仅在细节上有所不同,而又服务于相同的任务时,策略模式可以非常方便地允许在运行时根据条件选择正确的算法。

 2. 算法的透明性需求:策略模式通过定义算法族,将算法的实现和使用进行分离,使得算法的变化独立于使用它们的客户端。客户端只需关心策略接口,不必了解内部实现细节,从而使得算法实现能够自由切换,提升了算法的透明性。

 3. 避免使用多重条件选择语句:在没有策略模式的场景下,算法的选择可能依赖于多个条件判断语句(如 if-else 或 switch-case)。这种方式不仅使得代码臃肿难维,也使得新增或更改一个算法成为一项复杂且容易出错的任务。策略模式通过封装算法替代这些条件判断,简化了代码的管理。

 4. 当一个类定义了多种行为,并且这些行为在类的操作中以多个条件语句的形式出现:此时,将相关的条件分支移至它们各自的策略类中可以避免代码冗余,增强代码的可读性。

 5. 需要动态地改变方法的行为:在实际的业务场景中,随着产品的发展,业务规则可能频繁变化。策略模式允许在不改变客户端代码的基础上,通过切换不同的策略实现来适应业务规则的改变或扩展。

 6. 稳定算法类库的场合:在开发过程中有时会面临创建稳定的算法类库的需求。通过策略模式,可以轻松组织和维护大量具有共同接口的算法类,确保它们的替换和扩展都不会影响到使用它们的客户端。

 7. 提供一个类的操作时,多个算法也许从概念上具备不同的行为。比如,不同的排序算法(冒泡排序、快速排序等)或者不同的路径寻找算法(Dijkstra、A*等)。

    将策略模式应用到适合的场景中,可以显著提升代码的灵活性和可维护性,同时有助于形成清晰和可扩展的架构。在实现过程中,只需通过实现新的策略并向上下文注入即可应对需求变化,而大量的条件选择代码或是分支逻辑则可得到清除,保证了代码结构的整洁和稳定。

四、优缺点

 优点

 1. 灵活性高:策略模式提供了高度的灵活性,允许在运行时切换算法或行为。这种动态策略的更换能够轻松应对程序逻辑中经常发生的变化。

 2. 解耦策略接口和具体实现:通过将策略的创建与使用分离,客户端代码只需要依赖于策略接口而非具体的策略实现,从而实现了算法与客户端代码的解耦,使得程序更容易理解和维护。

 3. 易于扩展:由于策略模式基于策略接口来定义一系列可交换的算法,当需要新增一个具体策略类以实现新的算法或行为时,不需要修改现有代码,只需添加新的策略类即可。

 4. 可重用性:策略模式使得各种具体策略类可以在不同的上下文环境中重用,提高了代码复用率。

 5. 选择权和透明性:客户端有权选择算法的具体实现,策略模式同时保证了算法的透明性,即客户端无需关心算法内部的具体实现。

 缺点

 1. 策略类的增加:如果策略模式被频繁使用,系统中可能会存在大量的策略类。这些类的数量和复杂度的管理,就成为了维护的一个挑战。

 2. 客户端和策略类之间的通信开销:客户端必须知道不同策略之间的差异以便合理地选择适合的策略,对客户端来说可能需要理解所有策略类的相关知识,尤其是当策略类繁多且变化频繁时。

 3. 客户端必须了解所有策略类:客户端选择具体策略时,需要了解每个策略类的特点和适用场景,这就意味着客户端需要有一定的知识储备。

 4. 产生很多策略对象:如果每个策略需要作为单独的对象实例化,那么系统中将会产生大量的对象,可能会对系统的性能和资源利用产生影响。

    综上所述,策略模式在提高系统的灵活性、可重用性和扩展性方面提供了巨大的优势,但同时也带来了一定的管理成本。适用策略模式时应考虑这些优缺点,并在合适的场景下对其进行权衡。例如,在策略类众多时,可以使用依赖注入或服务定位模式来降低客户端与策略类之间的耦合度。此外,对于可能产生的对象数量,可以通过使用对象池或共享策略实例来减少内存占用和对象创建的性能开销。

五、最佳实践与使用注意事项

 最佳实践

 1. 明确策略界面:在设计策略模式时,应确保策略接口清晰明确。这意味着所有具体策略应该从同一接口或抽象类派生,实现接口中声明的所有方法。

 2. 最小化策略暴露的细节:策略应该尽可能地对用户透明。尝试隐藏具体策略类的实现细节,只公开必须的操作,这有助于降低系统的复杂性。

 3. 考虑使用工厂模式:为了避免在客户端代码中硬编码具体策略类,可以使用工厂模式来封装策略对象的创建逻辑,提供一种机制来创建和配置策略实例。

 4. 使用依赖注入:通过依赖注入框架或手动注入的方式,可以在运行时动态地向客户端提供具体的策略实例。这减少了客户端与具体策略之间的耦合,并提高了策略的可更换性。

 5. 考虑使用缓存:当策略对象无状态,且可能被频繁请求时,可以通过策略实例的缓存来减少对象的创建和销毁,进一步提升性能。

 6. 合理划分不同策略:确保每个策略都有它明确的责任界限,避免创建过于庞大或通用的策略类,从而保证策略的可管理性和可更换性。

 使用注意事项:

 1. 避免过度使用:只在有明显多个可互换算法存在的场景中使用策略模式。不要强行应用策略模式到不需要它的地方;这可能只会增加不必要的复杂性。

 2. 策略和上下文通信:确保策略与使用它的上下文之间的通信开销不会让策略模式的好处丧失。防止在策略和上下文之间过多地传递信息,这可能导致难以维护的复杂接口。

 3. 避免策略泛滥:随着系统的发展,可能需要不断地添加新的策略。应该定期审查和重构策略类,以避免复杂度螺旋上升。

 4. 文档化:当使用策略模式时,文档化各个策略类及其用途非常重要,这有助于新成员快速理解系统和维护代码。

 5. 策略类的测试:需确保为每个策略类编写单元测试,以保证其独立性和可靠性,同时便于随时切换或者新增策略。

    通过遵循这些最佳实践和注意事项,你可以更加高效地使用策略模式,并在保持代码清晰、可维护的同时,使其发挥最大的作用。策略模式是一个强大的设计工具,但正如任何工具一样,正确的使用方式是成功的关键。

六、与其他模式的比较

 策略模式与状态模式的比较:

 相似之处:
    - 策略模式和状态模式都是行为设计模式,它们都用于封装可以互换的行为或算法。

 不同之处:
    - 策略模式的行为或算法是根据某种任务的不同而变化的,客户端拥有对策略的控制权,并可以根据需要更换策略。因此,策略模式关注的是如何在不同策略间切换,以便完成不同的行为或算法。
    - 状态模式通常封装了对象在其内部状态改变时的变化行为。状态模式允许对象随内部状态变化而改变其行为,看起来就像改变了其类。因此,状态模式更多的是由对象的内部状态决定行为的改变,并不是由客户端直接控制。

 策略模式与模板方法模式的比较:

 相似之处:
    - 策略模式和模板方法模式都能够封装算法,让子类或策略类分别实现算法的不同部分。

 不同之处:
    - 模板方法模式通常通过一个抽象类来定义算法的骨架,将算法的具体实现推迟到子类中完成,这是类的行为模式。子类通常会覆盖抽象类中的一个或者多个步骤,而不是整个算法。
    - 策略模式则将算法的每个版本封装在不同的策略类中,形成一系列可互换的策略。调用者可以更换不同的策略对象来执行具体的算法,这是对象的行为模式。

 策略模式与工厂模式的比较:

 相似之处:
    - 策略模式和工厂模式都可以用来解耦对象的创建和使用。

 不同之处:
    - 工厂模式关注于对象的创建。通过工厂模式,客户代码通常不需要依赖于具体类的实例化过程,而是依赖于抽象接口。工厂模式提供了一个创建对象的接口,允许系统在不直接指定对象类的情况下创建对象。
    - 策略模式关注于行为的封装和动态替换。它定义了一系列的算法,把它们封装起来,并使它们可以互换。策略模式让算法的变化独立于使用算法的客户。

    以上便是策略模式与其他设计模式在概念上的一些异同。每种模式都有其特定的适用场景,了解并辨识这些场景对于选择最合适的设计模式至关重要。在设计系统时,经常根据实际需求,灵活组合使用多种设计模式。

七、策略模式的实际案例

    在本部分,我们将通过一个实际的案例来展示策略模式在工业界的应用。我们将以一家大型在线零售商的促销活动系统为例,该系统使用策略模式来管理不同的促销策略。

7.1 背景介绍

    这家在线零售商经常进行各种促销活动,如打折、满减、赠品等。每种促销活动都有其特定的规则和执行逻辑。为了管理这些促销活动并保持系统的灵活性,开发人员决定使用策略模式。

7.2 策略模式实现

 定义策略接口:
    首先,开发人员定义了一个名为PromotionStrategy的策略接口,用于规定所有促销策略必须实现的方法。

public interface PromotionStrategy {  
    double calculateDiscount(Order order);  
    String getDescription();  
}

 实现具体策略:
    接着,开发人员为每种促销活动实现了对应的策略类。这些类都实现了PromotionStrategy接口,并提供了具体的促销逻辑。

public class DiscountPromotionStrategy implements PromotionStrategy {  
    @Override  
    public double calculateDiscount(Order order) {  
        // 计算打折后的折扣金额  
        return order.getTotalPrice() * 0.9; // 假设打9折  
    }  
    
    @Override  
    public String getDescription() {  
        return "打折促销";  
    }  
}  

public class FullReductionPromotionStrategy implements PromotionStrategy {  
    @Override  
    public double calculateDiscount(Order order) {  
        // 根据订单金额计算满减后的金额  
        double reduction = 0;  
        if (order.getTotalPrice() >= 100) {  
            reduction = 20; // 满100减20  
        }  
        return order.getTotalPrice() - reduction;  
    }  
    
    @Override  
    public String getDescription() {  
        return "满减促销";  
    }  
}

 上下文类:
    然后,开发人员创建了一个名为PromotionContext的上下文类,用于根据当前的促销策略对象来执行促销逻辑。

public class PromotionContext {  
    private PromotionStrategy promotionStrategy;  
  
    public PromotionContext(PromotionStrategy promotionStrategy) {  
        this.promotionStrategy = promotionStrategy;  
    }  
  
    public double executePromotion(Order order) {  
        return promotionStrategy.calculateDiscount(order);  
    }  
  
    public String getPromotionDescription() {  
        return promotionStrategy.getDescription();  
    }  
}

 使用场景:
    在实际应用中,当用户下单时,系统会根据当前的促销活动和用户的订单信息来选择合适的促销策略。例如,如果用户的订单金额满足满减条件,系统将选择FullReductionPromotionStrategy;否则,系统将选择DiscountPromotionStrategy。

public class Main {  
    public static void main(String[] args) {  
        Order order = new Order();  
        order.setTotalPrice(120); // 假设订单总价为120元  
  
        // 根据订单信息选择合适的促销策略  
        PromotionStrategy strategy = new FullReductionPromotionStrategy();  
  
        // 创建上下文并执行促销逻辑  
        PromotionContext context = new PromotionContext(strategy);  
        double discountedPrice = context.executePromotion(order);  
        String description = context.getPromotionDescription();  
  
        System.out.println("折扣后的价格: " + discountedPrice);  
        System.out.println("促销描述: " + description);  
    }  
}

 优势分析:
    通过采用策略模式,这家在线零售商的促销活动系统实现了以下优势:

 1.灵活性:系统可以轻松添加或删除促销策略,而无需修改现有代码。

 2.可扩展性:当需要添加新的促销活动时,只需实现PromotionStrategy接口并创建相应的策略类。

 3.易于维护:每个促销策略都是独立的,这使得代码更加清晰和易于维护。

 4.客户端与策略解耦:客户端代码不依赖于具体的促销策略实现,从而提高了代码的可重用性和可测试性。

    总之,策略模式为这家在线零售商的促销活动系统带来了显著的益处,使得系统更加灵活、可扩展和易于维护。这也是策略模式在工业界中广泛应用的一个典型案例。

八、总结

    策略模式是一种使得算法能在运行时透明地互换的行为型设计模式。它通过定义一系列算法,并将每一个算法封装到具有共同接口的独立的类中,使得算法可以独立于使用它的客户而变化。这种模式特别有助于管理和维护与算法相关的代码,尤其是在算法选项繁多且经常变更的系统中。

 要点回顾:

 1. 策略模式的核心思想是针对一系列算法定义一个公共接口,使得这些算法在客户类中能够互换使用。
 2. 通过使用策略模式,可以避免在客户代码中使用大量的条件语句,从而降低其复杂性。
 3. 它有助于代码复用和隔离,算法的变更或添加新算法不会影响到使用算法的客户。
 4. 策略模式提升了算法的可测试性,并且可以提供更灵活的扩展性。

 实战价值:

 在现实世界的软件设计中,策略模式常被应用于以下几个方面:
 · 不同类型的排序或搜索操作,在不同上下文中需要不同的算法。
 · 业务规则的动态选择,比如税率计算、折扣计算等,因场景不同而变化的逻辑部分。
 · 在游戏开发中,不同类型的角色或敌人可能有不同的行为模式。
 · 图形渲染或数据压缩领域,针对不同场景选择不同的优化算法。

 在未来的软件设计工作中,可以考虑以下几点来利用策略模式:
 · 当面对多种算法或行为,并需要在运行时便捷地切换它们时,策略模式是一个理想的选择。
 · 如果你预见需要经常更换算法或逻辑,策略模式提供了一个良好的框架,以便于这些更改,并且不影响到已有的客户代码。
 · 对于测试驱动开发(TDD)的环境,策略模式使得针对每一种算法编写单独的测试变得更加容易。
 · 在构建需要高度可配置化行为的系统时,策略模式为将行为封装为可交换的部件提供了便捷方式,从而增强了系统的灵活性。

    总之,策略模式是面对多种具有相同目标但实现不同的算法时提供可扩展,易于维护,且高度解耦的解决方案。在未来软件设计的实践中,它可以作为一个强大的工具来管理和优化代码结构,确保软件系统具有更好的应对变化的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/388750.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何手机搜保育员答案?9个大学生必备的搜题 #微信#媒体#知识分享

可以说是搜题软件里面题库较为齐全的一个了,收录国内高校常见的计算机类、资格类、学历类、外语类、工程类、建筑类等多种类型的题目。它可以拍照解题、拍照答疑、智能解题,并支持每日一练、章节练习、错题重做等特色功能,在帮助大家解答疑惑…

【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)

文章目录 一、前言二、实验环境三、PyTorch数据结构0、分类1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration)查看可用gpu张量移动经典语句d…

Ansible file文件模块 设置文件的属性,比如创建文件、创建链接文件、删除文件

目录 语法创建目录创建链接文件删除文件 每个值的属性 语法 创建目录 ansible slave -m file -a path/data/app statedirectory path/data/app # 定义创建路径 statedirectory # 如果目录不存在就创建目录这就是创建目录成功之后的回显 可以看到,已经打印出目录a…

Rust 数据结构与算法:1算法分析之乱序字符串检查

Rust 数据结构与算法 一、算法分析 算法是通用的旨在解决某种问题的指令列表。 算法分析是基于算法使用的资源量来进行比较的。之所以说一个算法比另一个算法好,原因就在于前者在使用资源方面更有效率,或者说前者使用了更少的资源。 ●算法使用的空间指的是内存消耗。算法…

(通信)驻波

驻波是一种物理现象,它发生在频率相同、传输方向相反的两种波(不一定是电波)沿传输线形成的一种分布状态。 在这种状态下,一个波通常是另一个波的反射波。 在驻波中,波节和波腹的位置始终保持不变,给人一种…

vue-组件组成和组件通信(四)

组件的三大组成部分 (结构/样式/逻辑) scoped样式冲突 默认情况:写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式: 默认组件中的样式会作用到全局 2. 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组…

Mysql的安装、使用、优势与教程

一.安装 1.在小皮的设置界面检测3306端口,保障3306端口可用; 2、在小皮的首面界面,启动MySQL; 3、进行环境变量设置,找到MySQL的路径,进行复制; 4、在Windows的搜索栏内,输入“环境…

[OPEN SQL] 删除数据

DELETE语句用于删除数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要删除以下数据 1.删除单条数据 语法格式 DELETE <dbtab> FROM <wa>. DELETE <dbtab> FROM TABLE <itab>. DELETE FROM &…

PowerShell搭建vue起始项目

Windows PowerShell搭建vue起始项目 搜索PowerShell,以管理员身份运行。 复制文件夹路径 cd 到这个文件夹位置 命令行创建项目&#xff1a;vue create 项目名 这里写自己的项目名就行&#xff0c;我写的yeb vue create yeb 创建成功后是这样的 有颜色的就是选中的&#xff…

3D裸眼技术行业研究:2026年市场投资规模为10.78亿元

3D裸眼技术大多处于研发阶段&#xff0c;它的研发分两个方向&#xff0c;一是硬件设备的研发&#xff0c;二为显示内容的处理研发。第二种已经开始小范围的商业运用。大众消费者接触的不多。从技术上来看&#xff0c;3D裸眼可分为光屏障式(Barrier)、柱状透镜(Lenticular Lens)…

OAuth 2.0 协议介绍【实现 GitHub 第三方登录】

OAuth&#xff08;是 Open Authorization 开放授权的缩写&#xff09;,在全世界得到广泛应用&#xff0c;目前的版本是2.0版。 本文会对OAuth 2.0的设计思路和运行流程&#xff0c;做一个简明通俗的解释&#xff0c;主要参考材料为RFC 6749。 OAuth 2.0 是一个开放标准&#…

问题:实行网络化管理,为此需要做好以下几个方面的工作。() #知识分享#其他#职场发展

问题&#xff1a;实行网络化管理&#xff0c;为此需要做好以下几个方面的工作。() A、建立“公共部门—私人部门—第三部门”的合作网络 B、采用平等协商、双向互动、共同参与的决策方式&#xff0c;参与式决策应当成为网络化管理中的主要决策方式 C、建立“公共部门—私人部…

寒假学习记录17:包管理器(包管理工具)

概念 包&#xff08;package&#xff09; 包含元数据的库&#xff0c;这些元数据包括&#xff1a;名称&#xff0c;描述&#xff0c;git主页&#xff0c;许可证协议&#xff0c;作者&#xff0c;依赖..... 库&#xff08;library&#xff0c;简称lib&#xff09; 以一个或多个模…

算法刷题day13

目录 引言一、蜗牛 引言 今天时间有点紧&#xff0c;只搞了一道题目&#xff0c;不过确实搞了三个小时&#xff0c;才搞完&#xff0c;主要是也有点晚了&#xff0c;也好累啊&#xff0c;不过也还是可以的&#xff0c;学了状态DP&#xff0c;把建图和spfa算法熟悉了一下&#…

c语言(指针进阶)

指针 一.什么是字符指针二.使用指针数组模拟二维数组三.函数指针 一.什么是字符指针 字符指针&#xff1a;指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间&#xff0c;并有唯一确定的首地址。即将字符串的首地址赋值给字符指针&#xff0c;可让字符指针…

【自然语言处理】:实验1布置,Word2VecTranE的实现

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;答案链接http://t.csdnimg.cn/5cyMG 如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 实验1&#xff1a; Word2Vec&TranE的…

2024 前端面试题(GPT回答 + 示例代码 + 解释)No.21 - No.40

本文题目来源于全网收集&#xff0c;答案来源于 ChatGPT 和 博主&#xff08;的小部分……&#xff09; 格式&#xff1a;题目 h3 回答 text 参考大佬博客补充 text 示例代码 code 解释 quote 补充 quote 上一篇链接&#xff1a;2024 前端面试题&#xff08;GPT回答 示例…

c语言操作符(下)

目录 ​编辑 逗号表达式 下标访问[] 函数调⽤() sizeof 结构成员访问操作符 结构体 结构体声明 直接访问 .成员名 间接访问 结构体指针->成员名 逗号表达式 exp1, exp2, exp3, …expN 运算规则&#xff1a;从左向右依次执⾏。整个表达式的结果是最后⼀个表达…

【AIGC】Stable Diffusion的模型微调

为什么要做模型微调 模型微调可以在现有模型的基础上&#xff0c;让AI懂得如何更精确生成/生成特定的风格、概念、角色、姿势、对象。Stable Diffusion 模型的微调方法通常依赖于您要微调的具体任务和数据。 下面是一个通用的微调过程的概述&#xff1a; 准备数据集&#xf…