设计模式5-策略模式(Strategy)

设计模式5-策略模式

  • 简介
  • 目的
  • 定义
  • 结构
    • 策略模式的结构
    • 要点
  • 举例说明
    • 1. 策略接口
    • 2. 具体策略类
    • 3. 上下文类
    • 4. 客户端代码
  • 策略模式的反例
    • 没有使用策略模式的代码
  • 对比分析

简介

策略模式也是属于组件协作模式一种。现代软件专业分工之后的第一个结果是框架语音应用程序的划分。组建协作模式,通过晚期绑定来实现框架与应用程序之间的松耦合。组件协作是二者之间协作时常用的模式。

目的

在软件构建过程中,某些对象使用的算法可能多种多样。会经常改动。如果将这些算法都编码到对象中,将会使对象变得异常复杂。而且有时候不支持使用的算法也是一个性能负担。如何在运行时根据需要透明的更改对象的算法?将算法与对象本身上进行解耦。策略模式的目的就是避免上述问题。

定义

程序中定义一系列算法。把他们一个个封装起来。并且使他们可互相替换变化该模式使得算法可独立于使用它的客户程序而变化扩展或者进行子类化。

结构

在这里插入图片描述

策略模式的结构

策略模式包含以下几个部分:

  1. 策略接口(Strategy Interface):定义所有支持的算法的接口。
  2. 具体策略类(Concrete Strategy Classes):实现策略接口的具体算法。
  3. 上下文类(Context Class):包含一个策略对象的引用,并提供设置和执行策略的方法。

要点

策略模式及其子类为组件提供了一系列可重用的算法。从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。并且它提供了用条件判断语句以外的另一种选择。消除条件判断语句就是在解耦合。还有许多条件判断语句的代码通常都需要用策略模式去替换原有代码。如果策略模式对象没有实例变量那么各个上下文可以共享同一个策略模式的对象。从而节省对象开销。

举例说明

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

1. 策略接口

class Strategy {
public:virtual ~Strategy() {}virtual void execute() const = 0;
};

2. 具体策略类

class ConcreteStrategyA : public Strategy {
public:void execute() const override {std::cout << "ConcreteStrategyA executed" << std::endl;}
};class ConcreteStrategyB : public Strategy {
public:void execute() const override {std::cout << "ConcreteStrategyB executed" << std::endl;}
};

3. 上下文类

class Context {
private:Strategy* strategy;public:Context(Strategy* strategy = nullptr) : strategy(strategy) {}~Context() {delete strategy;}void setStrategy(Strategy* newStrategy) {delete strategy;strategy = newStrategy;}void executeStrategy() const {if (strategy) {strategy->execute();} else {std::cout << "No strategy set" << std::endl;}}
};

4. 客户端代码

int main() {Context context;context.setStrategy(new ConcreteStrategyA());context.executeStrategy();context.setStrategy(new ConcreteStrategyB());context.executeStrategy();return 0;
}

策略模式的反例

反例展示了没有使用策略模式时的代码,这样的代码往往存在代码重复、维护困难、扩展不便的问题。

没有使用策略模式的代码

class Context {
public:enum StrategyType {STRATEGY_A,STRATEGY_B};void executeStrategy(StrategyType type) const {switch (type) {case STRATEGY_A:std::cout << "Strategy A executed" << std::endl;break;case STRATEGY_B:std::cout << "Strategy B executed" << std::endl;break;default:std::cout << "No valid strategy selected" << std::endl;break;}}
};int main() {Context context;context.executeStrategy(Context::STRATEGY_A);context.executeStrategy(Context::STRATEGY_B);return 0;
}

对比分析

  • 正例(策略模式)

    • 可扩展性:可以轻松地添加新策略,而无需修改上下文类。
    • 可维护性:每个策略封装在独立的类中,代码更易读、更易维护。
    • 开闭原则:对扩展开放,对修改关闭。
  • 反例(未使用策略模式)

    • 可扩展性差:添加新策略需要修改上下文类的代码。
    • 可维护性差:所有策略代码集中在一个类中,代码量大,维护困难。
    • 违背开闭原则:每次添加新策略都需要修改上下文类,容易引入新的错误。

通过策略模式,代码的灵活性和可维护性显著提高,可以轻松地添加、删除或更改策略,而不影响客户端代码。

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

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

相关文章

金顺心贸易有限公司简介

金顺心贸易有限公司成立于2015年&#xff0c;注册地位于风景如画的广西壮族自治区防城港市东兴市。 金顺心贸易如他们的名字一样&#xff0c;有着实实在在的业绩和口碑的。他们专注于国际贸易&#xff0c;主营越南进口食品&#xff1a;果汁饮料、春卷皮、调味品、汤底、米粉、…

RabbitMQ消息队列 安装及基本介绍

一.MQ介绍 Message Queue &#xff08;MQ&#xff09;是一种跨进程的通信机制&#xff0c;用于在系统之间进行传递消息。MQ作为消息中间件&#xff0c;可以进行异步处理请求&#xff0c;从而减少请求响应时间和解耦 1.1 应用场景 1.1.1 系统之间通过MQ进行消息通信&#xff0…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-41目标检测数据集

41目标检测数据集 import os import pandas as pd import torch import torchvision import matplotlib.pylab as plt from d2l import torch as d2l# 数据集下载链接 # http://d2l-data.s3-accelerate.amazonaws.com/banana-detection.zip# 读取数据集 #save def read_data_b…

Windows 系统 Solr 8.11.3 安装详细教程(最新)

Windows 系统 Solr 8.11.3 安装详细教程 说明什么是Solr下载与解压如何启动启动命令&#xff1a;浏览器中打开dashboard其他命令查看关闭命令 说明 本次只是简单安装&#xff0c;为了在项目中使用&#xff0c;如果在公开服务器中安装需要更改开放端口&#xff0c;配置权限等。 …

【PL理论深化】(8) Ocaml 语言:元组和列表 | 访问元组中的元素 | 列表中的 head 和 tail | 基本列表操作符

&#x1f4ac; 写在前面&#xff1a;本章我们将探讨 OCaml 中的元组&#xff08;tuple&#xff09;和列表&#xff08;list&#xff09;&#xff0c;它们是函数式编程语言中最常用的数据结构。 目录 0x00 元组&#xff08;Tuple&#xff09; 0x01 访问元组中的元素 0x02 列表&…

《单片机》期末考试复习-学习笔记总结

题型 问答题(15分)编程题(65分)编程题1(20分)编程题2(45分)设计题(20分)一、问答题 1.1.单片机概念和特点 1.2. 51单片机的中断结构 1.3.主从式多机通讯的概念及其工作原理 多机通信是指两台以上计算机之间的数据传输,主从式多机通信是多机通信系统中最简单的一种,…

SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录 前言一、SDR模式1.1、设计代码1.2、testbench代码1.3、仿真分析 二、DDR模式下2.1、设计代码2.2、testbench代码2.3、仿真分析 三、OSERDES2级联3.1、设计代码3.2、testbench代码3.3、代码分析 前言 上文通过xilinx ug471手册对OSERDESE有了简单的了解&#xff0c;接…

PHP爬虫类的并发与多线程处理技巧

PHP爬虫类的并发与多线程处理技巧 引言&#xff1a; 随着互联网的快速发展&#xff0c;大量的数据信息存储在各种网站上&#xff0c;获取这些数据已经成为很多业务场景下的需求。而爬虫作为一种自动化获取网络信息的工具&#xff0c;被广泛应用于数据采集、搜索引擎、舆情分析…

柔性数组(flexible array)

柔性数组从C99开始支持使用 1.柔性数组的概念 概念&#xff1a; 结构体中&#xff0c;结构体最后一个元素允许是未知大小的数组&#xff0c;这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点&#xff1a; 结构体中柔性…

九、(正点原子)Linux定时器

一、Linux中断简介 1、中断号 每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断&#xff0c;有的资料也把中断号叫做中断线。在 Linux 内核中使用一个 int 变量表示中断号。在Linux中&#xff0c;我们可以使用已经编写好的API函数来申请中断号&#xff0c;定义…

基于公有云部署wordpress

云平台选择 腾讯云 阿里云 华为云 项目部署 一、架构讲解 1.1、定义与组成 LNMP是Linux、Nginx、MySQL&#xff08;或MariaDB&#xff09;和PHP&#xff08;或Perl、Python&#xff09;的首字母缩写&#xff0c;代表在Linux系统下使用Nginx作为Web服务器&#xff0c;MySQL作为…

ai轨迹过京东m端

声明(a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本…

Unity Animator 运行时修改某个动画状态的播放速度

1.添加动画参数&#xff0c;选择需要动态修改速度的动画状态 2.在属性面板种设置速度倍速参数

自然语言处理(NLP)—— 深度学习

1. 词嵌入&#xff08;Embeddings&#xff09; 1.1 词嵌入的基本概念 词嵌入&#xff08;Embeddings&#xff09;是一种将词语映射到高维空间&#xff08;比如N300维&#xff09;的技术&#xff0c;使得词语之间的欧几里得距离与它们的语义距离相关联。这意味着在这个向量空间…

windows MSVC编译安装libcurl

$ git clone https://github.com/curl/curl.git $ cd curl/winbuild依照curl/winbuild/README.md的指示&#xff0c; 启动visual studio的命令行工具&#xff0c;这里要注意别选错. 如果要编译出x64版本的libcurl&#xff0c;就用x64的命令行工具&#xff1b;如果要编译出x86…

论文学习:基于知识图谱的RAG进行客服问答

1.简介 文章名称&#xff1a; Retrieval-Augmented Generation with Knowledge Graphs for Customer Service Question Answering&#xff08;基于知识图谱的RAG进行客服问答&#xff09; 2.摘要ABSTRACT 在客户服务技术支持中&#xff0c;迅速准确地检索相关的过往问题对于有…

【干货】微信小程序免费开源项目合集

前言 2024年了&#xff0c;还有小伙伴在问微信小程序要怎么开发&#xff0c;有什么好的推荐学习项目可以参考的。今天分享一个收集了一系列在微信小程序开发中有用的工具、库、插件和资源&#xff1a;awesome-github-wechat-weapp。 开源项目介绍 它提供了丰富的资源列表&…

【每日一练】python运算符

1. 算术运算符 编写一个Python程序&#xff0c;要求用户输入两个数&#xff0c;并执行以下运算&#xff1a;加法、减法、乘法、求余、除法、以及第一个数的第二个数次方。将结果打印出来。 a input("请输入第一个数&#xff1a;") b input("请输入第二个数&…

【Java】字节数组 pcm 与 wav 格式互转 (附原理概述)

前言 最近实现了一个文字转语音的功能&#xff0c;语音引擎返回的是pcm格式的数据。需要转化成wav格式前端才能播放。本文首先会给出解决方案&#xff0c;后续会讲背后的原理。 场景 git 仓库 https://github.com/ChenghanY/pcm-wav-converter 1. pcm wav 转化工具类 入参和…

人脑计算机技术与Neuroplatform:未来计算的革命性进展

引言 想象一下&#xff0c;你在某个清晨醒来&#xff0c;准备开始一天的工作&#xff0c;而实际上你的大脑正作为一台生物计算机的核心&#xff0c;处理着大量复杂的信息。这并非科幻电影的情节&#xff0c;而是人脑计算机技术即将带来的现实。本文将深入探讨FinalSpark公司的…