目录

  • 策略模式
    • 引例
    • 动机 Motivation
    • 模式定义
    • 结构
    • 要点总结

策略模式

引例

税务计算系统,根据各个国家的税法,进行税务计算。各个国家税法规定差别很大,需对应进行相应的实现。

  • 常规解耦前写法
    使用if-else语句或switch-case语句进行结构化分而治之且有增加的扩展变化需求可能,扩展新的需求不方便。
    // 税务类型 枚举类型
    enum TaxBase
    {CN_Tax,US_Tax,DE_Tax,// 扩展,更改变化点FR_Tax
    };class SalesOrder
    {TaxBase tax;
    public:double CalculateTax(){...if(tax == CN_Tax){// 中国税务计算实现...}else if(tax == US_Tax){// 美国税务计算实现}else if(tax == DE_Tax){// 德国税务计算实现...}// 增加拓展法国,以下为更改变化点else if(tax = FR_Tax){// 法国税务计算实现...}			...}
    };
    

以上违背“开闭原则”,即对扩展开发,对更改封闭

  • 策略模式搭配简单工厂写法,代码具有良好的本地性

    // 税法策略类 —— 基类
    class TaxStrategy
    {
    public:virtual double Calculate(const Context& context) = 0;virtual ~TaxStrategy(){}
    }// 各税法对应派生类
    class CNTax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 中国税务计算实现...}
    };class USTax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 美国税务计算实现...}
    };class DETax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 德国税务计算实现...}
    };// 扩展变化点
    class FRTax : public TaxStrategy
    {
    public:virtual double Calculate(const Context& context){// 法国税务计算实现...	}
    };// 以下部分稳定
    class SalesOrder
    {
    private:// 多态的变量,一般使用指针TaxStrategy* strategy;
    public:// 工厂模式创建一个具体的税务策略类SalesOrder(StrateFactory* strateFactory){this->strategy = strategyFactory->NewStrategy();}~SalesOrder(){delete this->strategy;}double CalculateTax(){...Context context();double val = strategy->Calculate(context);	// 多态调用...}
    }
    

动机 Motivation

  • 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;有时支持不使用的算法也是一个性能负担。
  • 策略模式可以在运行时根据需要透明地更改对象的算法,将算法与对象本身解耦

模式定义

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

结构

在这里插入图片描述
红色部分为稳定部分,蓝色部分为变化部分。

要点总结

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

来源:极客班——C++设计模式入门

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

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

相关文章

VS Git巨坑 切换分支失败导致原分支被修改

VS2013Git 首先当前分支(分支A)的变更已经提交,应该可以正常切换分支。 想切换到一个比较老的分支B(跟当前分支存在较大差异,增加了很多文件),VS中提示切换失败,当前分支仍然是分支A…

uniapp页面间通信uni.$on与通过uni.navigateTo中eventChannal的方式的区别

背景。无意间开发uniapp程序用到了页面跳转数据传递的两种方式。但各用于什么场景,有什么区别记录一下。大模型给的内容较多,贴出一些结论。eventChannel文档链接uni.$emit文档链接 页面跳转而非全局事件通知,优先选择eventChanel的方式。 首…

理解对话上下文

1、pom依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><langchain4j.version>…

【Java高频面试问题】数据库篇

【Java高频面试问题】数据库篇 为什么MySQL选择B树作为索引一、B 树的优势特性二、与常见数据结构的对比 索引优化一、索引类型及使用场景二、索引优化核心策略1. 避免索引失效场景2. 性能优化实践3. 表结构与架构优化 三、高频面试问题参考答案总结&#xff1a;面试核心要点 数…

《Whisper:开启语音识别新时代的钥匙》

Whisper 模型:技术革新的基石 在当今科技飞速发展的时代,自动语音识别(ASR)技术作为人工智能领域的关键分支,正深刻地改变着人们的生活与工作方式。从智能语音助手到实时字幕生成,从语音交互设备到智能客服系统,ASR 技术无处不在,为人们带来了前所未有的便利与效率提升…

关于 pdd:anti_content参数分析与逆向

一、逆向目标 目标&#xff1a;获取pdd商品列表接口数据网址&#xff1a;aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbS9ob21lL2hvbWUv 二、逆向步骤 2.1 anti_content 入口定位 >1 找到需加密参数 >2 全局搜索定位 这里只出来一个结果&#xff0c;很明显&#xff0c;点进去。 …

限流系列之五:TDMQ RabbitMQ Serverless 版限流机制深度解析与实践指南

导语 分布式集群限流是保障云服务高可用性的核心技术手段&#xff0c;其意义不仅在于防止系统过载&#xff0c;更是构建弹性架构、优化资源效率、实现业务可持续性的关键策略。未来&#xff0c;随着边缘计算和 Serverless 的普及&#xff0c;限流技术将进一步与底层基础设施深…

官方链接内容整理的 Spark-TTS Windows 安装完整流程

官方链接内容整理的 Spark-TTS Windows 语音克隆 安装完整流程 官方链接内容整理的 Spark-TTS Windows 安装完整流程&#xff1a; Spark TTS&#xff1a;基于大型语言模型的文本转语音模型 Spark-TTS 是一个先进的文本转语音系统&#xff0c;利用大型语言模型&#xff08;LLM…

Spring Cloud Config动态刷新实战指南

以下是利用 Spring Cloud Config + Bus 实现配置动态刷新的完整步骤和原理说明: 一、核心原理 消息总线机制 Bus 通过消息代理(如 RabbitMQ/Kafka)建立公共 Topic(默认 springCloudBus),当配置变更时,任一服务触发刷新请求,消息会广播至所有监听该 Topic 的服务实例,实…

Linux 修改密码教程

Linux 修改密码教程 Linux 系统中修改密码是非常常见的管理操作&#xff0c;无论是修改当前用户密码还是其他用户的密码&#xff0c;通常都可以通过终端完成。本文将详细介绍如何在 Linux 系统中修改密码&#xff0c;并包括修改其他用户密码的方法。 1. 修改当前用户密码 修改…

正则表达式详解:从基础到高级应用的全面指南

文章大纲 引言&#xff1a;什么是正则表达式&#xff1f; 在编程和文本处理领域&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;是一种强大的工具&#xff0c;用于描述和匹配文本中的特定模式。它本质上是一种由字符和特殊符号组成…

flutter结合ai工具(其他语言通用)

一、为什么Flutter开发者需要免费AI工具&#xff1f; 1. 减少重复性编码 Flutter开发中&#xff0c;UI组件、网络请求、状态管理等代码高度重复&#xff0c;AI可自动生成这些代码。 示例&#xff1a;输入"创建一个Material Design风格的登录页面"&#xff0c;AI工具…

鸿蒙容器组件 Row 全解析:水平布局技术与多端适配指南

一、引言&#xff1a;Row 组件 —— 水平布局的核心引擎 在鸿蒙全场景应用开发中&#xff0c;Row 容器组件作为水平布局的标准载体&#xff0c;通过声明式语法实现子组件的有序水平排列。作为线性布局体系的重要组成部分&#xff0c;其简洁的属性体系与强大的适配能力&#xf…

基于 PCIe 架构的处理器系统

处理器系统A 在有些处理器系统中&#xff0c;没有直接提供PCI总线&#xff0c;此时需要使用PCIe桥&#xff0c;将PCIe链路转换为PCI总线之后&#xff0c;才能连接PCI设备 在这种结构中&#xff0c;RC由两个FSB-to-PCIe桥和存储器控制器组成。 FSB是Front Side Bus的缩写&…

Qt 与 Halcon 联合开发五:为何与如何将耗时算法移入子线程

在 Qt 应用程序开发中&#xff0c;界面响应速度直接影响用户体验。而在集成图像处理库如 Halcon 的项目中&#xff0c;耗时算法一旦运行于主线程中&#xff0c;极易造成界面卡顿甚至假死。本篇文章将围绕耗时算法必须移入子线程执行这一核心原则&#xff0c;结合 Qt 与 Halcon …

聚焦OpenVINO与OpenCV颜色通道转换的实践指南

颜色通道顺序问题&#xff1a;OpenVINO模型RGB输入与OpenCV BGR格式的转换 在计算机视觉任务中&#xff0c;框架间的颜色通道差异常导致模型推理错误。以下方法解决OpenVINO模型需要RGB输入而OpenCV默认输出BGR的问题。 理解核心差异 OpenCV的imread()函数遵循BGR通道顺序&a…

【软考高级系统架构论文】论企业集成平台的理解与应用

论文真题 企业集成平台 (Enterprise Integration Platform, EIP) 是支持企业信息集成的环境,其主要功能是为企业中的数据、系统和应用等多种对象的协同运行提供各种公共服务及运行时的支撑环境。企业集成平台能够根据业务模型的变化快速地进行信息系统的配置和调整,保证不同…

LabVIEW光谱仪设计

采用LabVIEW 开发平台&#xff0c;搭配品牌硬件构建光谱仪系统&#xff0c;实现光谱数据的高效采集、分析与显示&#xff0c;展现 LabVIEW 在仪器开发中的快速集成与灵活扩展能力。 ​ 应用场景 科研领域&#xff1a;用于材料光谱特性研究、光学实验数据分析&#xff0c;支持高…

Nginx配置文件介绍和基本使用

Nginx配置文件介绍和基本使用 Nginx 是一款高性能的 HTTP 服务器、反向代理服务器及电子邮件代理服务器&#xff0c;由俄罗斯工程师 Igor Sysoev 开发&#xff0c;并于2004年首次公开发布。以轻量级、高并发能力、稳定性和低资源消耗著称。 主要功能 HTTP服务器&#xff1a;…

DataSophon 1.2.1集成Flink 1.20并增加JMX 监控

参考:datasophon集成Flink1.20.0 此大神有多篇集成其他服务的文章&#xff0c;建议关注一波 一、服务集成 flink 1.20 下载 1.构建压缩包&#xff1a; 1.1拷贝需要的包 tar -zxvf flink-1.20.0-bin-scala_2.12.tgz tar czf flink-1.20.0.tar.gz flink-1.20.0# 为了flink cdc…