AI Chat 设计模式:5. 策略模式

news2024/9/20 16:50:42

本文是该系列的第五篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的旁白。

问题列表

  • Q.1 我想学习一下策略模式
  • A.1
  • Q.2 你先给我简单讲解一下吧
  • A.2
  • Q.3 你举得这个电商平台例子不错,给我写一下它的c++实现吧
  • A.3
  • Q.4 使用策略模式,有什么要点吗
  • A.4
  • Q.5 使用策略模式时,有哪些容易犯得错误
  • A.5
  • Q.6 画一下策略模式的类图
  • A.6

Q.1 我想学习一下策略模式

A.1

当然,请问你对策略模式有些什么了解呢?或者你希望我从哪个方面开始解释呢?

Q.2 你先给我简单讲解一下吧

A.2

当然,策略模式是一种行为型设计模式,它可以帮助我们在运行时根据不同的情况选择不同的算法或行为。它使得算法独立于使用它的客户端,简化了算法的添加、移除或替换过程。

在策略模式中,我们将一组相似的算法封装成一个个独立的策略类。这些策略类实现了一个公共的接口或基类,并分别提供了不同的算法实现。客户端可以在运行时选择使用哪个策略,将这种灵活性交给了客户端。

策略模式有三个关键角色:

  1. 环境(Context):扮演策略模式的使用者,将具体策略的选择委托给策略对象。
  2. 抽象策略(Strategy):定义了所有具体策略所需实现的接口或基类
  3. 具体策略(Concrete Strategy):实现了抽象策略定义的接口或基类,并提供了具体的算法实现

举个例子,假设我们有一个电商平台,涉及到不同的支付方式(如支付宝、微信支付、银行卡支付等),我们可以使用策略模式来处理支付方式的选择。我们可以定义一个支付策略接口,然后针对每种支付方式实现具体的支付策略类。客户端只需要通过设置不同的支付策略,就可以根据用户选择的支付方式来完成支付操作。

策略模式是一种比较简单的模式,说白了就是“组合”的应用,环境类组合了一个抽象策略类对象。给环境类设置不同的的具体策略类对象,它就会具有不同的行为。
下面我们直接看一下代码。

Q.3 你举得这个电商平台例子不错,给我写一下它的c++实现吧

A.3

当然,下面是一个简单的C++实现示例:

// 策略接口
class PayStrategy {
public:
    virtual void pay(float amount) = 0;
};

// 具体策略类:支付宝支付策略
class AlipayStrategy : public PayStrategy {
public:
    void pay(float amount) override {
        cout << "使用支付宝支付:" << amount << "元" << endl;
        // 具体的支付逻辑
    }
};

// 具体策略类:微信支付策略
class WeChatPayStrategy : public PayStrategy {
public:
    void pay(float amount) override {
        cout << "使用微信支付:" << amount << "元" << endl;
        // 具体的支付逻辑
    }
};

// 具体策略类:银行卡支付策略
class BankCardStrategy : public PayStrategy {
public:
    void pay(float amount) override {
        cout << "使用银行卡支付:" << amount << "元" << endl;
        // 具体的支付逻辑
    }
};

// 环境类
class PaymentContext {
private:
    PayStrategy* strategy;

public:
    PaymentContext() : strategy(nullptr) {}

    void setStrategy(PayStrategy* strategy) {
        this->strategy = strategy;
    }

    void doPayment(float amount) {
        if (strategy) {
            strategy->pay(amount);
        } else {
            cout << "请选择支付方式" << endl;
        }
    }
};

// 使用示例
int main() {
    PaymentContext context;

    // 选择支付方式
    PayStrategy* strategy = new AlipayStrategy();
    context.setStrategy(strategy);

    // 执行支付
    float amount = 100.0;
    context.doPayment(amount);

    // 更改支付方式
    strategy = new WeChatPayStrategy();
    context.setStrategy(strategy);
    
    // 执行支付
    amount = 200.0;
    context.doPayment(amount);

    delete strategy;
    return 0;
}

这个例子中,我们定义了一个支付策略接口 PayStrategy,并分别实现了支付宝、微信支付和银行卡支付的具体策略类。然后我们通过 PaymentContext 环境类来设置具体的支付策略,并执行支付操作。

请注意,在实际的项目中,可能会有更复杂的逻辑和更多的策略类。这个例子仅仅是一个简单的演示,帮助你理解策略模式的基本概念。

Q.4 使用策略模式,有什么要点吗

A.4

当使用策略模式时,有几个要点需要考虑:

  1. 抽象策略的设计:定义一个抽象的策略接口或基类确保所有具体策略都实现了相同的方法。这样可以让客户端针对抽象策略编程,而不是具体策略。

  2. 策略的选择方式:客户端需要有一种机制来选择使用哪个具体策略。可以通过参数传递、配置文件、用户选择等方式实现策略的选择。同时,这种选择方式应该具备灵活性和可扩展性。

  3. 策略对象的创建和生命周期管理:在运行时创建策略对象,并在不需要时进行销毁。可以使用工厂模式或依赖注入等方式来创建对象,确保策略对象的创建和管理的灵活性。

  4. 策略的替换和扩展:策略模式的一个重要特点是可以动态地替换或扩展策略。这意味着,如果需要新增一种策略,只需添加一个新的具体策略类,并进行相应的修改,而无需修改现有的代码。

  5. 策略的性能和复杂度:需要对所用策略进行评估,确保策略的执行效率和复杂度在可接受的范围内。有时候,某些策略可能更适合特定的场景,而某些策略可能更适合处理大量数据或复杂逻辑。

总体来说,策略模式提供了一种灵活和可扩展的方式来处理不同的算法或行为。将策略与客户端解耦,使得算法可以独立于客户端进行演化和变化。通过合理地设计抽象策略、选择策略的方式以及管理策略对象的生命周期,可以使策略模式变得更加有效和可维护。

应该是讲解的明明白白了,不如再问问易错点吧。

Q.5 使用策略模式时,有哪些容易犯得错误

A.5

在使用策略模式时,有一些常见的错误可能会犯,以下是一些容易犯的错误:

  1. 复杂化策略对象:有时候会倾向于在策略对象中添加过多的逻辑和功能,导致策略对象变得复杂。这违背了策略模式的初衷,应该保持策略对象的简单和聚焦。如果需要处理复杂逻辑,可以考虑将其封装在上下文对象中,而不是在策略对象中。

  2. 错误的使用上下文对象:上下文对象在策略模式中起到了重要的作用,负责协调策略的选择和执行。但是有时候会错误地将过多的责任放在上下文对象中,破坏了模式的结构。应该保持上下文对象的简单和轻量,只负责委托给具体策略执行相应的算法。

  3. 忽略策略对象的状态:在某些情况下,策略对象可能会具有状态,影响其行为的结果。在使用策略模式时,需要注意策略对象的状态管理,确保在切换策略或执行算法时,状态的正确性和一致性。

  4. 过度使用策略模式:策略模式适用于将算法变化封装成独立的策略类,并在运行时进行选择和调用。然而,并不是每个变化都需要使用策略模式。如果算法变化不频繁或固定不变,或者仅存在很少的变化,使用策略模式反而会增加不必要的复杂性。

  5. 遗漏默认策略:当选择策略模式时,经常需要考虑到是否需要提供默认策略。如果客户端没有显式地选择策略,或者选择了一个不存在的策略,需要有一个默认的策略来处理这种情况,以免引发错误。

这些是一些常见的错误,可以在使用策略模式时注意避免。通过理解模式的原则和核心思想,设计合理的策略接口和上下文对象,以及正确的使用策略对象,可以有效避免这些错误。

希望这些信息对你有所帮助。如果你还有其他问题,请随时提问!

Q.6 画一下策略模式的类图

A.6

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

青岛大学_王卓老师【数据结构与算法】Week04_09_线性表的应用2_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

使用 tail -f 实时观测服务器日志输出

在开发阶段, 有 console 端的输出, 总是可以方便实时地看到应用的日志. 可一旦应用部署到服务器上之后呢, 日志被输出到文件中, 在某些情景下需要不停地查看日志文件的输出以定位某些问题, 此时是否还能像开发那样实时查看日志呢? 答案是可以的! 这个命令就是 tail -f . tail…

vue2 element-ui 2.9.1版不支持抽屉el-drawer

一个老项目中想使用抽屉 el-drawer&#xff0c;死活没有反应。 查了下element-ui的版本是2.9.1 再看其他一个正常使用抽屉的项目的element-ui版本。 但是 2.14.1 的element-ui版本又存在菜单管理无法折叠菜单项的问题。 看来还是得抽空解决在2.14.1菜单无法折叠的问题了。

一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

2013 年&#xff0c;JDN Dionisio 曾发表了一篇名为《3D Virtual Worlds and the Metaverse: Current Status and Future Possibilities》的论文&#xff0c;深入探讨与归纳了虚拟世界的几个发展阶段&#xff0c;可以简单的归纳为&#xff1a; 第一阶段&#xff1a;基于计算机文…

零代码量化投资:用ChatGPT获取新浪财经上的股票实时行情

现在很多免费的股票数据库&#xff0c;比如akshare&#xff0c;其实是从新浪财经或者东方财富网站上爬取下来的。如果能直接从新浪财经或者东方财富网站上爬取数据&#xff0c;可以获取更全面更即时的信息。 可以在ChatGPT中输入提示词如下&#xff1a; 写一段Python代码&…

探索stable-diffusion技术乐园:活学活用界面参数

开篇 嗨!欢迎踏入我们充满有趣和创新的stable-diffusion技术乐园,让我们一起走进stable-diffusion界面参数的世界,看看怎样如行家袋里取物般自在地活用这些参数! 看了这么多大V、大卡和群粉们使用的英文,提起来有点沉,别急,我会尽量使用轻松的语气带你一起探索这些小秘…

MySQL视图、索引、导入导出、执行计划

目录 一、前言 1.导读 2.学习的好处 二、视图 1.什么是视图 2.视图与数据表的区别 3.使用视图的优点 4.视图的语法 1.创建视图&#xff08;CREATE VIEW&#xff09; 2.查询视图数据 3.更新视图数据 4.修改视图定义(ALTER VIEW) 5.删除视图&#xff08;DROP VIEW&a…

VSCode中打开NodeJS项目自动切换对应版本的配置

这几年搞了不少静态站点&#xff0c;有的是Hexo的&#xff0c;有的是VuePress的。由于不同的主题对于NodeJS的版本要求不同&#xff0c;所以本机上不少NodeJS的版本。 关于如何管理多个NodeJS版本&#xff0c;很早之前就写过用nvm来管理的相关文章&#xff0c;这里就不赘述了&a…

第四范式携「式说」亮相世界人工智能大会 大模型落地进入加速时刻

7月6日-8日&#xff0c;以“智联世界 生成未来”为主题的2023世界人工智能大会&#xff08;WAIC&#xff09;在上海召开&#xff0c;本届大会聚焦通用人工智能发展。第四范式携「式说」大模型亮相现场&#xff0c;更有第四范式「大模型之城」首秀&#xff0c;汇聚了大模型在金融…

Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…

休闲时光:最近上映的电影与爬虫世界,带您彻底放松!

大家好&#xff0c;我是安果&#xff01; 周末是与亲朋好友相聚的好时机&#xff0c;可以选择一部大家都喜欢的电影&#xff0c;彻底放松&#xff0c;共同度过一个愉快而难忘的周末 本篇文章将介绍如何使用 Scrapy 爬取最新上映的电影 目标对象&#xff1a; aHR0cHM6Ly93d3cubW…

深入浅出讲解Python中的可变类型与不可变类型,以及赋值,浅拷贝与深拷贝的区别

文章目录 1、不可变数据类型2、可变数据类型3、赋值&#xff0c;浅拷贝与深拷贝3.1 赋值操作符 3.2 浅拷贝copy()3.3 深拷贝copy() 小结 在Python中&#xff0c;数据类型主要分为可变数据类型和不可变数据类型。主要的区别在于可变数据类型的值可以改变&#xff0c;而不可变数据…

【网络系统集成】路由器实验

1.实验名称:路由器RIP协议配置 2.实验目的 在PacketTracer中进行模拟实验,配置RIP协议,验证RIP协议更新时间及路由状态变化,加深对路由器RIP协议相关知识的理解与掌握。 3.实验内容 (1)拓扑结构图 (2)ip地址分配与端口分配

Mybatis基础总结1

Mybatis快速入门 一.Mybatis快速入门1.1 框架介绍1.2 ORM介绍1.3 原始jdbc操作&#xff08;查询数据&#xff09;1.4原始jdbc操作&#xff08;插入数据&#xff09;1.5 原始jdbc操作的分析1.6 什么是Mybatis1.7 Mybatis的快速入门1.7.1 环境搭建1.7.2编写测试代码 1.8 知识小结…

Linux进程调度

转自&#xff1a;深入理解Linux进程调度(0.4)_进程调度 城_城中之城的博客-CSDN博客 一、进程调度概览 进程调度是操作系统最重要的内容之一&#xff0c;也是学习操作系统的重点和难点。关于进程本身的实现和管理请参看《深入理解Linux进程管理》。关于进程调度&#xff0c;我…

阿里云ECS服务器架构X86计算_ARM_GPU/FPGA_裸金属_超级计算集群

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

mysql单表查询,排序,分组查询,运算符,select,order by,group by

CREATE TABLE emp (empno int(4) NOT NULL, --员工编号ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工名字job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工工作mgr int(4) NULL DEFAULT NU…

json 解析chrome浏览器插件json-handle

插件地址 非常好用&#xff0c;平常工作中需要经常查看对象属性&#xff0c;展开的时候往往都是很长的数据&#xff0c;有了这个大大提升效率了

云计算值得学习吗

云计算值得学习吗 云计算作为一项重要的技术和商业模式&#xff0c;未来的发展前景非常广阔。随着企业和个人对云计算需求的增长&#xff0c;以及新兴技术的不断突破和创新&#xff0c;云计算将继续引领科技进步和社会发展&#xff0c;并为用户带来更多的便利和创新&#xff0…

项目配置日志的打印目录,输出日志

最近的项目需要在服务器上跑&#xff0c;配个日志方便查看。简单记录一下&#xff0c; resources下新增日志配置的xml文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"10 seco…