【GeekBand】C++设计模式笔记4_Strategy_策略模式

news2024/9/25 6:18:55

1. “组件协作”模式

  • 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式
    • Template Method
    • Strategy
    • Observer / Event

2. Strategy 策略模式

2.1 动机(Motivation)

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

2.2 模式定义

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

2.3 实例代码

2.3.1 strategy1
// 税率类
enum TaxBase {
	CN_Tax,		// 中国
	US_Tax,		// 美国
	DE_Tax,		// 德国
	FR_Tax      // 更改,增加法国税率
};

// 订单类
class SalesOrder {
    TaxBase tax;	// 税率
public:
    double CalculateTax() {
        // ...
        
        if (tax == CN_Tax) {
            // CN***********
        }
        else if (tax == US_Tax) {
            // US***********
        }
        else if (tax == DE_Tax) {
            // DE***********
        }
		else if (tax == FR_Tax) {  // 更改,条件判断语句中增加对法国税率的分支
			// ...
		}

        // ....
     }
};
2.3.2 strategy2
// 税率基类
class TaxStrategy {
public:
    virtual double Calculate(const Context& context)=0;	// 纯虚函数
    virtual ~TaxStrategy() {}	// 基类的析构函数要声明成virtual
};

// 中国税率,继承基类,重写虚函数
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(StrategyFactory* strategyFactory) {
        this->strategy = strategyFactory->NewStrategy();	// 工厂模式创建对象
    }
    
    ~SalesOrder() {
        delete this->strategy;
    }

    public double CalculateTax() {
        // ...
        Context context();
        
        double val = strategy->Calculate(context);	// 多态调用
        // ...
    }  
};

2.4 结构(Structure)

在这里插入图片描述

2.5 要点总结

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

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

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

相关文章

如何确定SAP 某些凭证或者单号的号码编码范围的 OBJECT 是什么?

在SAP的运维或者项目实施中,有时会如何确定SAP 某些凭证或者单号的号码 OBJECT 是什么? 一般一下常用的可以通过事务代码 例如: XDN1 Create Number Ranges for Customer Accounts,定义客户编码FBN1查看维护会计凭证号范围 我…

【项目】多设计模式下的同步异步日志系统

文章目录 项目介绍开发环境核心技术日志系统介绍为什么需要日志系统日志系统技术实现同步写日志异步写日志 相关技术知识补充不定参函数不定参宏函数的使用C中不定参函数的使用C中不定参函数的使用 设计模式单例模式工厂模式建造者模式代理模式 日志系统框架设计模块划分日志等…

springboot+阿里云物联网教程

需求背景 最近有一个项目,需要用到阿里云物联网,不是MQ。发现使用原来EMQX的代码去连接阿里云MQTT直接报错,试了很多种方案都不行。最终还是把错误分析和教程都整理一下。 需要注意的是,阿里云物联网平台和MQ不一样。方向别走偏了。 概念描述 EMQX和阿里云MQTT有什么区别…

springboot整合openfeign

文章目录 准备一、引入必要依赖二、写一个feign client并暴露到注册中心2.1 client2.2 开启Feign客户端功能 三、别的服务引入IProductClient并调用方法3.1 建一个order-service,引入IProductClient所在模块3.2 注入IProductClient,并调用方法 四、启动服…

Github优质项目推荐-第一期

文章目录 Github优质项目推荐一、【free-for-dev】,88.4k stars二、【linux-command】,31.5k stars三、【system-design-primer】,270k stars四、【GitHub-Chinese-Top-Charts】,99.1k stars五、【Docker-OSX】,46k st…

分布式计算框架

进入Scala模式 终端里输入Scala 创建一个新的Scala文件 vim 文件名.scala 复制粘贴代码 ctrlshift c/v 使用vim 先进入插入模式,可以通过按i键来实现,然后粘贴代码,完成后按Esc键退出插入模式,保存并退出可以通过输入:wq然后按…

HarmonyOS开发之利用TextPicker实现日期选择框只有【年】

效果图&#xff1a; 一&#xff1a;实现年份数组 function generateYearArray(startYear, endYear) {const yearArray [];for (let year startYear; year < endYear; year) {yearArray.push(year年);}return yearArray; } 二&#xff0c;设置年份区间&#xff08;1995,2…

每日论文2——用于锁相环应用的0.025%直流电流失配电荷泵

《A 0.025% DC Current Mismatch Charge Pump for PLL Applications 》2021 IEEE International Midwest Symposium on Circuits and Systems (MWSCAS) The Key Lab of micro-nano electronics and system integration of Xian city, Xian 本文结构主要不同是仅用了一个OPA&…

JAVA并发编程系列(11)线程池底层原理架构剖析

面试官&#xff1a;说说JAVA线程池的几个核心参数&#xff1f; 之前我们用了10篇文章详细剖析了synchronized、volatile、CAS、AQS、ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier、并发锁、Condition等各个核心基础原理&#xff0c;今天开始我们说说并发领域的各种…

基于单片机的精确电压表DA-AD转换

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DAC0832和ADC0832检测电压&#xff0c;0到8.5V&#xff0c;设计复位电路 LED管显示实际稳压值&#xff0c;初始电压0 二、硬件资源 基于KEIL5编写C代码&#xff0c…

《MATLAB项目实战》,专栏目录和介绍

文章目录 前言专栏介绍&#x1f393;一、 项目实战篇和GUI界面篇&#x1f393;二、 项目基础篇总结 前言 MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具&#xff0c;它提供了一个高效、简洁的编程环境&#xff0c;使用户能够进行从简单的矩阵运算到复杂的多维数…

QT+ESP8266+STM32项目构建三部曲二--阿里云云端处理之云产品流转

一、创建一个新的产品 创建两个设备&#xff1a;一个用于stm32端连接并动态上传数据&#xff0c;一个用于上位机端订阅获取数据 添加功能&#xff0c;也就是物模型的的标签&#xff0c;这里根据自己在设计过程中需要的标签&#xff0c;自由设计 我这里定义了两个不同数据类型…

HBase DDL操作代码汇总(namespace+table CRUD操作)

HBase DDL操作 DDL操作主要是关于命名空间和表格的内容增删改查。 注&#xff1a;如果出现无法连接到zookeeper等的相关错误&#xff0c;可以将以下代码打jar包&#xff0c;在HMaster节点上执行 错误提示&#xff1a; Exception in thread “main” java.net.SocketTimeoutExc…

苹果更新过时产品:三款 Mac 成“古董”,九款 Mac 彻底“停产”

9 月 24 日消息苹果今天更新了“过时产品”名单&#xff0c;新增加了三款 Mac 型号&#xff0c;并将另外九款 Mac 型号从“过时产品”归为“停产产品”。 新入列的 Mac 过时产品&#xff1a; MacBook Air&#xff08;视网膜显示屏&#xff0c;13 英寸&#xff0c;2018 年&…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24 1. Enriching Datasets with Demographics through Large Language Models: What’s in a Name? K AlNuaimi, G Marti, M Ravaut, A AlKetbi, A Henschel… - arXiv preprint arXiv …, 2024 通过大型语言…

Centos下安装Maven(无坑版)

Linux 安装 Maven Maven 压缩包下载与解压 华为云下载源&#xff0c;自行选择版本 下面的示例使用的是 3.8.1 版本 wget https://repo.huaweicloud.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压 tar -zxvf apache-maven-3.8.1-bin.tar.gz移…

腾讯云点播及声音上传

文章目录 1、开通腾讯云点播2、获取腾讯云API密钥3、完成声音上传3.1、引入依赖3.2、参考&#xff1a;接入点地域3.3、参考&#xff1a;任务流设置3.4、首先修改配置&#xff1a;3.4.1、 3.5、TrackInfoApiController --》 uploadTrack()3.6、VodServiceImpl --》 uploadTrack(…

长列表加载性能优化

一、长列表优化概述 列表是应用开发中最常见的一类开发场景&#xff0c;它可以将杂乱的信息整理成有规律、易于理解和操作的形式&#xff0c;便于用户查找和获取所需要的信息。应用程序中常见的列表场景有新闻列表、购物车列表、各类排行榜等。随着信息数据的累积&#xff0c;特…

MobaXterm基本使用 -- 服务器状态、批量操作、显示/切换中文字体、修复zsh按键失灵

监控服务器资源 参考网址&#xff1a;https://www.cnblogs.com/144823836yj/p/12126314.html 显示效果 MobaXterm提供有这项功能&#xff0c;在会话窗口底部&#xff0c;显示服务器资源使用情况 如内存、CPU、网速、磁盘使用等&#xff1a; &#xff08;完整窗口&#xff0…

kafka集群架构与原理

前言 这次我们从消息队列开始讨论。生产者-消费者模型中间需要一个消息队列&#xff0c;以存储生产者的产品。对传统的消息队列来说&#xff0c;它支持点对点&#xff08;P2P&#xff09;和发布/订阅&#xff08;Pub/Sub&#xff09;两种消息模型。在点对点模型中&#xff0c;消…