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

本文是该系列的第五篇,采用问答式的方式展开,问题由我提出,答案由 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.hqwc.cn/news/14122.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ的可视化管理页面简介

模块 描述 Overview 概览 Connections 查看连接情况 Channels 信道(通过)情况 Exchanges 交换机(路由)情况,默认四类七个 Queues 消息队列情况 Admin …

TLS、SSL、CA 证书、公钥、私钥

1. HTTP 的问题 HTTP 协议是超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff09;的缩写&#xff0c;它是从 WEB 服务器传输超文本标记语言 HTML 到本地浏览器的传送协议。HTTP 设计之初是为了提供一种发布和接收 HTML 页面的方法&#xff0c;时至今日&#x…

javaWeb中的Ajax_待后期增加

前言&#xff1a; Ajax是一种在JavaWeb开发中常用的技术&#xff0c;通过它可以实现异步通信和动态加载数据&#xff0c;提升用户体验。 正文&#xff1a; 首先我们得明白异步通信&#xff0c;客户端发出请求后可以继续执行其他操作 由于原生的Ajax过于复杂 so&#xff1a; …

DFS解决N-皇后问题

题目&#xff1a; n−皇后问题是指将 n个皇后放在 nn的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包…

论文学习——U-Net: Convolutional Networks for Biomedical Image Segmentation

UNet的特点 采用端到端的结构&#xff0c;通过FCN&#xff08;最后一层仍然是通过卷积完成&#xff09;&#xff0c;最后输出图像。通过编码&#xff08;下采样&#xff09;-解码&#xff08;上采样&#xff09;形成一个“U”型结构。每次下采样时&#xff0c;先进行两次卷积&…

CygWin:windows上运行类linux命令

CygWin是一个在Windows平台上运行的类UNIX模拟环境&#xff0c;是Cygnus Solutions公司开发的自由软件。它提供了类似于Linux系统的终端环境和工具&#xff0c;使用户可以在Windows平台上运行Unix-like的程序&#xff0c;如Bash、awk、sed和grep等 。 下载setup.exe 安装Cygwin…

【Excel经验】日期时间处理方法

概览-公式汇总 公式功能公式公式说明提取时间中的日期TEXT(A2,“yyyy-mm-dd”)A2列数据格式样例&#xff1a;2023/7/5 6:20:10计算耗时得到单位&#xff1a;秒数VALUE(TEXT(B2-A2,“[ss]”))A2、B2列数据格式样例&#xff1a;2023/7/5 6:20:10计算耗时得到格式化显示年月日B2-…

ModaHub魔搭社区:向量数据库Milvus Lite 的优势和安装教程

想要体验开源向量数据库MIlvus,缺少专业的工程师团队作为支撑?Milvus 安装环境受限? 别担心,轻量版 Milvus 来啦! 有用户反馈刚开始接触 Milvus 或者想要在 Notebook 中进行快速实验时,安装或部署 Milvus 有些力不从心 。开发了 Milvus 的轻量级版本Milvus Lite ,方…

Vue3使用element-plus实现弹窗效果-demo

使用 <ShareDialog v-model"isShow" onChangeDialog"onChangeDialog" /> import ShareDialog from ./ShareDialog.vue; const isShow ref(false); const onShowDialog (show) > {isShow.value show; }; const onChangeDialog (val) > {co…

【ElasticSearch】JavaRestClient实现索引库和文档的增删改查

文章目录 一、RestClient1、什么是RestClient2、导入demo工程3、数据结构分析与索引库创建4、初始化JavaRestClient 二、RestClient操作索引库1、创建索引库2、删除索引库3、判断索引库是否存在 三、RestClient操作文档1、新增文档2、查询文档3、修改文档4、删除文档5、批量导入…

[SWPUCTF 2022 新生赛]js_sign

[SWPUCTF 2022 新生赛]js_sign 查看源码js文件 hint的意思是敲击码 解出flag&#xff0c;记得去掉nssctf&#xff0c;包上NSSCTF{} Tap Code - 许愿星 (wishingstarmoye.com)

Linux(Ubuntu)+Qt+C++与OpenCV窗体程序使用

程序示例精选 Linux(Ubuntu)QtC与OpenCV窗体程序使用 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Linux(Ubuntu)QtC与OpenCV窗体程序使用>>编写代码&#xff0c;代码整洁&am…