常用设计模式(策略模式)-c++版

设计模式C++实现(2)——策略模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

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

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

3、举例
有这样一个场景,我们需要计算中国、美国、德国的国家税法,有一个SalesOrder类,我们实现cal方法,常用是if-else,或者switch-case,这样完全可以实现。
但是,我们做面向对象程序设计时,不应该静态的去看一个软件的设计,而是要动态来看,即要有时间轴的概念,要把思维上升到未来时间段。
现在需求更改,需增加法国的税法,那么我们在源代码基础上进行更改,enum中增加法国,calculate中增加else-if。这样做真的好吗?

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){  //更改
			//...
		}

        //....
     }
    
};

这里更改代码对软件来说并不具有良好的扩展性。代码应该用扩展来应对未来需求的变化,这样做违背开闭原则,这样做的结果是出现源码更改、软件重新编译、软件重新测试、软件重新部署等一系列代价。对于扩展,策略模式出来了。


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(StrategyFactory* strategyFactory){
        this->strategy = strategyFactory->NewStrategy();
    }
    ~SalesOrder(){
        delete this->strategy;
    }

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

首先,我们实现了一个基类,析构函数声明为virtual,这里是为了避免调用多态时delete的问题,然后声明纯虚函数cal,几个类分别继承基类实现各自的方法。
当然,在实际开发过程中,这几个子类需要写在各自的.h和.cpp中。
当我们需要扩展的时候,就可以增加一个对应的子类来进行扩展实现,对于我们的工程而言,就可以弄成增加了一个动态库或者静态库而已。
然后,看一下SalesOrder的实现,在类中定义一个基类指针

TaxStrategy* strategy;

用于保存实例化出来的子类对象。当然这里对象的生成是放在工厂模式中生产出来。后续会讲解工厂模式

4、总结
(a)Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
(b)Strategy模式提供了用条件判断语句以外的另一种选择,消除条件,判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
但是当你的if-else在绝对不更改的情况下,就不用考虑策略模式。例如你的逻辑是根据性别来进行判断的。当然,以我们开发经验来讲,业务通常是可变的,所以
(c)如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。
这里顺便提升了代码的性能,可以这样理解,你的if-else始终只能调用一个逻辑,例如在某一次它调用了中国,那其他else-if里面的代码被装载到内存的代码段中,但我们并没有调用它,说白了,有很多的代码加载了而我们并没有使用,这在一定程度上产生了性能负担。
而使用策略模式以后,通过基类指针保存的子类对象类型直接调用指定类型的方法,这样代码段少。我们代码最好的情况是加载到cpu高级缓存中,如果代码段过长,有些就会放到主存或者更极端的放到虚拟内存硬盘中。这样肯定性能就不会提升。

《C++设计模式》策略模式 介绍了C++模式的策略模式 阅读详情

相关推荐

【C++设计模式】策略模式

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。通过将每个算法封装到具有共同接口的独立类中,客户端可以在不改变自身代码的情况下选择要使用的算法。这使得算法可以独立于客户端变化,易于维护和扩展。策略模式通过将算法封装到独立的类中,使得算法可以在运行时动态地切换和选择。这种灵活性使得策略模式成为一种强大的设计模式,特别适用于需要经常变化或者有多种选择的算法场景。通过使用策略模式,可以提高代码的灵活性、可维护性和可扩展性,使得系统更加健壮和可靠。

m0_62599305的博客 1904

策略模式 if else_使用枚举+工厂模式+策略模式去掉多重if...else

“现实生活中,我们进经常会遇到满减活动或者打折活动,同一个促销活动可能后不同的策略,比如满30减5,满200打8折......用程序来实现的话,可以使用工厂设计模式+策略设计模式”01—工厂设计模式这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。您需要一辆汽车,可以...

weixin_39812046的博客 455

POWER(十一)charge pump原理

电荷泵是一种基于电容充放电原理的DC-DC转换电路,通过开关控制实现电压转换,包括升压、降压和负压输出。其核心是利用电荷守恒原理,通过电容存储和转移电荷来改变输出电压。典型拓扑结构包括倍压电路和多阶升压电路,具有结构简单、体积小等优势。关键参数包括转换效率、输出电流能力和开关频率,适用于芯片供电、显示屏驱动等低功耗场景。LVDS部分补充说明了自举电路在驱动电路中的应用及其自同步特性。

zhlwsh的博客 2823

C++常见设计模式之策略模式

1、策略模式是指定义一系列的算法,把它们一个个封装起来,并使他们可以相互替换,本模式使得算法可以独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外接口一样,只是各自实现上存在差异。 2、下面以高速缓存(Cache)的替换算法为例,实现策略模式,什么是Cache的替换算法?当Cache缺失时,Cache控制器必须选择Cache中的一行,并用欲获得的数据来替换它(替换选中的这一行)。如何去选择Cache中的一行,怎样选择然后去进行替换,这个选择的方法就是Cache的替换算法。如FIFO(先进先出)

scarificed的博客 1384

衡山派Luban-Lite系统SDIO无线网络配置实战:以D133CBV-QFN88开发板与RTL8189模组为例

本文详细介绍了在衡山派D133CBV-QFN88开发板上,为Luban-Lite系统配置SDIO无线网络的完整实战流程。通过配置SDMC接口、RTL8189 Wi-Fi驱动、lwIP协议栈及内核参数,并解决编译分区问题,最终实现Wi-Fi网络连接与测试,为嵌入式设备联网提供清晰指导。

weixin_35677363的博客 268

VCL for PHP,Konopka Signature VCL Controls (Raize Components 6.2.3) for Delphi 10.4

The Raize Components suite includes a variety of interface design tools for Delphi programming language and C ++ Builder, which includes over 125 VCL controls and over 100 different tools for creating...

weixin_42137539的博客 853

代码中大量的if/else,你有什么优化方案?

观点一(灵剑): 前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅的优化掉这些多余的if/else? 1. 提前return 这是判断条件取反的做法,代码在逻辑表达上会更清晰,看下面代码: if (condition) { // do something } else { return xxx; } 其实,每次看到上面这种代码,我都心里抓痒,完全可以先判断!condition,干掉else。 i

佳佳乐的博客 1385

0.嵌入式控制器EC实战 Embedded Controller开发概述

文章目录前言1.嵌入式控制器EC概述2.EC芯片框图(IT8502为例)3.General Purpose I/O Port (GPIO)4.SMBus(System Management Bus,系统管理总线)5.PWM、TACH6.KBC(KeyBoard Controller)7.PS/28.ADC(模数转换)总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 1.嵌入式控制器EC概述 嵌入式控制器EC是挂在CPU的L

qq_30135687的博客 1万+

如何用策略模式,优化你代码里的的if-else?

什么是策略模式?它的原理实现是怎么样的?定义一系列算法,封装每个算法,并使他们可以互换,不同的策略可以让算法独立于使用它们的客户而变化。以上定义来自设计模式之美感觉有点抽象?那就来看一张结构图吧Strategy(抽象策略):抽象策略类,并且定义策略执行入口ConcreteStrategy(具体策略):实现抽象策略,实现algorithm方法Context(环境):运行特定的策略类。这么看结构其实还是不复杂的,而且跟状态模式类似。那么这个代码怎么实现?

BASK2311的博客 555

OpenClaw实战系列04:Jira/Confluence深度集成实战指南

汇总 Confluence 空间 TEAM 下所有关于“性能优化”的文档,输出要点自然语言创建和查询 Jira 任务,无需离开聊天工具基于 Confluence 的私有知识库问答,让 AI 真正理解团队文档Jira 与 Confluence 联动,打通项目管理与知识管理定时同步与通知,自动化团队信息流转至此,你的 OpenClaw AI 助理已经不仅是一个聊天机器人,而是真正融入团队工作流的“智能项目管理助手”。下一期我们将带来OpenClaw 自定义技能开发实战。

PeterPan的博客 574

全网最全RT-DETR涨点改进,基于官方源码1:1还原,在Ultralytics项目中配置rtdetr-r18、rtdetr-r34、rtdetr-r50、rtdetr-r101版本~小论文大论文必备

本文详细介绍了如何将RT-DETR的ResNet18/34/50/101/154版本移植到ultralytics项目中。主要内容包括:1) RT-DETR核心特点,如高效混合编码器、IoU感知查询选择等;2) 提供完整ResNet核心代码;3) 分步配置指南,包括创建模块文件和修改tasks.py;4) 各版本yaml配置文件的创建方法。该方案可帮助研究者快速实现RT-DETR改进,适用于目标检测相关论文研究。所有配置文件均可正常运行,为实验部署提供了便利。

Ai缝合怪、助力小伙伴高效发论文 3933

C++设计模式:策略模式

策略模式简述 在实际应用中,时常会遇到需要运行时判断执行具体算法的场景。这个时候,使用多个if else判断会让我们的代码显得很臃肿,灵活运用哈希表和策略模式会减少核心业务逻辑代码的规模,提高其可读性和可扩展性。 示例:分享给朋友功能 举个最常见的栗子,有篇文章写的很好,想分享给朋友,通常会出现多个选项:分享至微信好友,QQ好友,朋友圈等。简化的代码示意如下: void share(const std::string& content, const std::string& shareTyp

teemology的博客 335

T113-S3-RTL8211网口phy芯片调试

在嵌入式系统开发中,网络连接是至关重要的一部分。T113-S3开发板搭载了RTL8211系列的网口PHY芯片,用于实现以太网连接。在开发过程中,对于网口的稳定性和性能的调试至关重要。本篇博客将介绍如何调试T113-S3开发板中的RTL8211网口PHY芯片,以确保网络连接的正常工作。

flypig has a dream! 4614

设计模式之策略模式

优点:1) 灵活性和可扩展性:策略模式提供了一种灵活的机制来改变对象的行为。通过使用不同的策略类,可以在不修改原有代码的基础上,方便地增加新的策略。这有助于保持软件的可扩展性和灵活性。2) 消除条件语句:策略模式通过消除显式的条件语句(如if-else或switch-case语句),使得代码更加简洁易读。客户端只需要与抽象的策略接口交互,而无需关心具体的实现细节。3) 更好的组织代码:策略模式有助于将相关的算法和行为组织在一起,形成独立的策略类。这有助于提高代码的组织性和可维护性。

红军不怕远征难,万水千山只等闲 2121

【OpenClaw从入门到精通】第11篇:OpenClaw 2026多模态实战全攻略:OCR/语音/图像自动化(附完整代码+双部署方案)

本文聚焦OpenClaw 2026版核心升级的多模态能力,从底层架构原理到实操落地全流程拆解。先解析“统一指令解析+多工具适配器”的核心设计逻辑,再提供阿里云规模化部署(适合批量任务)与本地汉化版部署(适合隐私数据调试)的详细步骤,含依赖安装、配置验证完整操作;随后落地三大高频实战场景——OCR合同信息结构化提取、会议录音自动转写纪要、电商商品图片智能打标,每个场景均提供可直接运行的完整代码、执行结果演示及流程说明;最后补充多模态任务避坑指南、性能优化技巧与成本控制方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2612

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++ 常用设计模式

工厂模式 策略模式 适配器模式 单例模式 原型模式 模板模式 建造者模式 外观模式 组合模式 代理模式 享元模式 桥接模式 装饰模式 备忘录模式 中介者模式 职责链模式 观察者模式 工厂模式 工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式 1)、简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。 typedef enum { T8...

a834595603的博客 8110

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++设计模式——策略模式(Strategy Pattern)

C++设计模式——策略模式(Strategy Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——策略模式(Strategy Pattern)目录定义实现示例传统的策略模式实现使用函数指针实现策略模式工厂模式和策略模式对比总结参考资料 定义 Define a family of algorithms,encapsulate each one,and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 策略模式是指定

leonardohaig的博客 4774

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++ 设计模式-策略模式

策略模式的介绍和使用

wangdamingll的博客 2569

C++常见设计模式——策略模式

设计模式是对设计原则的具体化。用江湖话说就是武林秘籍,总结出来的一些固定套路,可以帮助有根基的程序员迅速打通任督二脉,从此做什么都特别快。 C++常见设计模式——策略模式传统的策略模式实现使用函数指针实现策略模式 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。 相比于使用大量的if…else,使用策略模式可以降低复杂度,使得代码更容易维护。 ...

hang_1994的博客 1247

c++设计模式之策略模式

策略模式是一种行为型设计模式,它可以让用户定义一系列算法,并将每个算法独立的封装成独立的类,使他们可以互相替换。这种模式让算法的变化独立与使用算法的前端。

漫步者 1431

C++ 设计模式之策略模式

C++ 设计模式之策略模式

L_qingting的博客 1181

设计模式C++实现——策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。         策略模式UML图如下:           举例:         游泳池中有不同种类的鸭子,有绿头鸭,红头鸭,橡皮鸭,木头鸭等。不同鸭子的特征或行为不同。绿头鸭(MallardDuck)可以叫声是“quack”,会飞;橡皮鸭叫声是“queak”,不会飞;木头鸭不会叫,

walkerkalr的专栏 1万+

【c++设计模式22】行为模式7:策略模式(Strategy Pattern)

原创作者:郑同学的笔记原创地址:https://zhengjunxue.blog.youkuaiyun.com/article/details/132920283qq技术交流群:921273910# 一、定义策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。客户端代码在运行时选择所需的算法。

junxuezheng的博客 2042

【C++设计模式之Strategy策略模式】

策略模式(Strategy Pattern)是一种行为设计模式,旨在将算法与使用它的客户端解耦,使得算法可以独立于客户端变化。通过定义一系列算法并将其封装在独立的策略类中,策略模式允许在运行时动态切换算法,从而提升代码的灵活性和可维护性。

weixin_43488529的博客 1591

C++设计模式行为模式———策略模式

策略模式中的若干个策略对象相互之间是完全独立的, 它们不知道其他对象的存在。当我们想使用对象中各种不同的算法变体,并希望能够在运行的时候切换这些算法时,可以选择使用策略模式来处理这个问题。以往利用增加新的f条件分支来支持新算法的方式违背了开闭原则,引人策略模式后,通过增加新的策略子类实现了对开闭原则的完全支持,也就是以扩展的方式支持未来的变化。

无敌岩雀的博客 1762
上一篇: 基于TCP的Qt网络通信
下一篇: 设计模式介绍及面向对象设计原则
bostonAlen
博客等级 码龄9年 4348粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值