C++中的开闭原则使用C++多态功能实现附源码

开闭原则(OCP)解析:构建可扩展的软件架构 开闭原则(Open-Closed Principle)是面向对象设计的核心原则之一,强调软件实体应对扩展开放而对修改关闭。其技术本质是通过抽象层建立稳定架构,利用多态和接口隔离实现功能扩展。在微服务架构和敏捷开发中,良好的OCP实践能显著降低模块耦合度,提升代码可维护性。典型实现方式包括策略模式、观察者模式等设计模式,Spring框架的依赖注入和React的组件设计都是OCP的现代实践。对于电商促销系统、游戏引擎等需要频繁迭代的场景,遵循OCP原则可使新增功能时核心代码保持零修改,有效控制代码腐化。 阅读详情
开闭原则

使用开闭原则之前一个银行柜员会将所有的工作都操作一遍,这样会大大降低办事的效率,而且银行的业务不适合扩展,没扩展一项业务就要培训所有的业务员。改为使用开闭原则之后,每个银行业务员只负责一项业务即可,这样做增加了系统的复杂性,但是想要新增业务只需要增加个人员,培训一个人新技能即可。也即是增加系统复杂性,但是原有的基础不变的情况下就可实现对业务的扩展。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YfsWW7QJ-1602047574374)(picture/image-20201007130546290.png)]

具体的CPP代码如下:

#include <iostream>

using namespace std;

// 在使用开闭原则之前
// 所有的事情都一个对象中完成,显得类很臃肿
class BankWorker
{
public:
    void SaveMoney(void)
    {
        cout << "save money" << endl;
    }

    void WithdrawMoney(void)
    {
        cout << "withdraw money" << endl;
    }

    void TransferMoney(void)
    {
        cout << "transfer money" << endl;
    }
};

/* 使用开闭原则之后 */
// 定义一个虚类,相当于java中的接口
class OcpBankWorker
{
public:
    virtual void DoSomething(void) = 0;
};

// 虚函数实现
class SaveBankWorker : public OcpBankWorker
{
public:
    virtual void DoSomething(void)
    {
        cout << "save money ocp" << endl;
    }
};

class WithdrawBankWorker : public OcpBankWorker
{
public:
    virtual void DoSomething(void)
    {
        cout << "withdraw money ocp" << endl;
    }
};

class TransferBankWorker : public OcpBankWorker
{
public:
    virtual void DoSomething(void)
    {
        cout << "transfer money ocp" << endl;
    }

};

// 框架函数
void HowDo(OcpBankWorker &ocpBankWorker)
{
    ocpBankWorker.DoSomething();
}

// 使用多态的三个原则
// 1.要有继承
// 2.要有函数重写
// 3.要有父类指针(父类引用)指向子类对象
int main(int argc, char const *argv[])
{
    // 在使用开闭原则之前
    cout << "before use open close principle" << endl;

    BankWorker *bw = new BankWorker;
    bw->SaveMoney();
    bw->TransferMoney();
    bw->WithdrawMoney();

    cout << "=========================================" << endl;
    // 使用开闭原则之后
    // 使用多态技术实现
    OcpBankWorker *aw = NULL;
    aw = new SaveBankWorker;
    HowDo(*aw);
    delete aw;

    aw = new WithdrawBankWorker;
    HowDo(*aw);
    delete aw;

    aw = new TransferBankWorker;
    HowDo(*aw);
    delete aw;

    cout << "open close principle" << endl;
    return 0;
}

上述程序执行之后输出结果:

before use open close principle
save money
transfer money
withdraw money
=========================================
save money ocp
withdraw money ocp
transfer money ocp
open close principle
C++实现一个基于多态的职工管理系统(附源码) 简单实现一个基于多态的职工管理系统~ 阅读详情

相关推荐

C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码、有过程截图

C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码,有过程截图 书籍信息管理系统的设计与实现(基于多态) 学生姓名: 学 号: 指导老师: 所 在 系: 专 业: 班 级: C++课程设计实训报告C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码,有过程截图书籍信息管理系统的设计与实现(基于多态)目录目录摘 要一 前 言1.1系统前景1.2开发环境1.3系统主要功能1.3.1管理系统需求1.3.2书籍信息管理系统主要功能二 程序设计具体实现2.1创建书籍管

Ewigkeit_的博客 525

C++设计原则——开闭原则(持续更新中)

一、开闭原则到底有什么用? 开闭原则属于六大设计原则之一,百度百科上面介绍开闭原则:开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。 意思就是说我们可以扩展类,但是不能修改类。这句话听着很绕口,但是在实际开发软件时,这个原则是经常被使用的。 二、开闭原则有什么特点 其实特点在上面已经说过了,...

专注音视频底层算法与工程实现,深入解析数字信号处理。深入研究WebRTC 3A、多麦声源定位、vad、语音识别等技术 1384

C++多态Demo

长方形和三角形均继承于形状,拥有高和宽,分别求面积

c++开闭原则

本文章主要讲价了C++中如何实现开闭原则,以及开闭原则的好处,用法等。

miracle 3427

多态代码实例

通过两个程序代码例子彻底理解什么是多态,什么是虚函数;

SPAD 单光子雪崩二极管

SPAD,全称为,是一种高灵敏度的光电探测器件,能够在非常低的光照水平下检测单个光子。SPAD在工作时,当一个光子被探测器吸收后,能够触发一个雪崩效应,产生一个可以被检测到的电信号。

qq_42786033的博客 1万+

C++设计模式(23种)汇总及代码实现

它是继承复用的基石,只有当衍生类可以替换掉基类,软件单位功能不受到影响的时候,基类才能真正被复用,而衍生类也能够在积累的基础上增加新的行为。提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。它结合了两个独立接口的功能,将一个类的接口转换成客户期望的另一个接口,让原本不兼容的类或者函数可以协同运作,是两个不兼容的接口之间的桥梁。3.当进行深拷贝的时候,需要编写较为复杂的代码,而且当对象之间存在多重嵌套时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现复杂。

songbijian的博客 7202

HDR视频技术之七:逆色调映射

HDR 技术说是继 4K 之后视频领域的又一次重大技术突破,不仅提高图像的动态范围,同时也提供了更宽的色域,并提升了画面在高光和暗部的细节信息,带给观看者更加真实的视觉体验。但作为 HDR 产业链的核心,内容短缺的问题仍然是 HDR 普及和成熟的重要限制因素。众多电视厂商将 HDR 技术作为其产品规划中的重要技术,主要是在硬件方面进行提升。而由于 HDR 内容制作对于设备要求较高,对采集、调色、显示等多方面都需要较高的质量要求,内容制作的复杂度和周期长等因素,导致了 HDR 内容的匮乏。

多媒体开发者 2422

如何用C++做好开闭原则呢?

C++语言以功能强大和超级复杂著称。很多人学了多年,还是会一头雾水。究其原因,是因为C++语言主要有4种编程范式:面向过程编程、面向对象编程、泛型编程、函数式编程。每种范式,已经很复杂了,再把它们糅合起来,天哪,头都秃了…… 但是,如果等你运用熟练了,你就会觉得游刃有余。今天,我们一起来用C++来尝试做一个小小的例子。如何用C++优雅地实现开闭原则。 1. 需求 现在,我们有一个小小的需求:某公司是专门生产钢笔的,其中,钢笔的颜色有红色、绿色、黑色、黄色等,钢笔的笔尖分为大、中、小三种。现在,我们..

rendonghao的博客 708

SAP FICO 银企直连

银企直联或者自动付款的目的是和银行做一个接口,把SAP中的到期应付款(也包括预付款)按照一定格式(银行要求的)在审批后发送给银行,请银行按照这个付款指定进行付款,并跟踪付款状态的过程,这个过程在SAP中如何实现呢?根据个人项目经验,客户需求可分为如下三种: 1. 第一种是完全不自动方式,仅批量生成付款凭证,实际的付款还是通过原来的流程执行,和银行没有任何接口; 2. 第二种是半自动方式,这种方式下需要按照银行的要求的格式生成付款条件,然后把付款文件下载下来,通过企业版的网银接口把付款文件进行上载,提交后

IamRunjiang的博客 9288

利用setEcoMode优化innovus中的ecoAddRepeater批量操作效率

本文详细介绍了在Cadence Innovus工具中,如何利用setEcoMode命令的batchMode参数,显著提升ecoAddRepeater命令在批量插入buffer或inverter时的操作效率。通过合并重复的初始化和数据库更新开销,该模式可将大规模时序修复操作的执行速度提升数倍,并提供了完整的脚本示例与最佳实践,帮助后端设计工程师优化ECO流程。

mango的博客 511

开闭原则(C++)

概念     就一个类而言,应该仅有一个引起它变化的原因。每个类实现一个功能。 简述     单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为类实现过多的功能点,以保证

先锋小牛 2930

ABAP Cloud define table 里的 not null 究竟在约束什么?——语义、场景与可运行示例

ABAP Cloud 中 not null 与 NULL 的用法解析 本文探讨了 ABAP Cloud 中 not null 关键字的语义与使用场景,对比了传统 ABAP 与 ABAP Cloud 在表字段定义上的差异: 核心概念 not null 是数据库层的列约束,强制字段不能存储 NULL 值 ABAP Cloud 通过 DDL 显式声明列是否允许 NULL,HANA 上 CDS 表默认创建为 NOT NULL 使用建议 主键、外键、审计字段等必须使用 not null 业务上可缺失的字段(如批准日期

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 299

C++基于多态实现依赖颠倒原则附源码

依赖颠倒原则 关于多态的实现原理以及实例见前几天更新的C++多态一文: C++多态 传统的过程式设计倾向于使用高层的模块依赖低层次的模块,抽象层依赖于具体层 没有使用依赖颠倒之前,上层业务逻辑依赖底层业务逻辑 依赖颠倒原则 使用了依赖颠倒之后,上层业务逻辑和底层模块都依赖于抽象层,代码复杂了,但是系统易于维护了 依赖颠倒的实现也是基于多态的基础之上,,具体的Cpp代码实现如下: #include <iostream> using namespace std; // 让computer框架和

andrewbytecoder 1615

【同等学力】2005-数学⭐✨

有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色,每个正方形只能染一种颜色,如果要求染红、黄、白色的正方形分别至少出现一个,问有多少种不同的染法?3、(4分)设G是一个有n个结点m条边的连通简单平面图,若n≥3,则m≤3n-6.4、(4分)证明:任何连通简单平面图至少有一个结点的度数不超过5

super_mochi1 306

YOLOV12进阶:MSDA多尺度空洞注意力机制解析与实战,突破检测尺度瓶颈

在目标检测中,“尺度差异”是个老大难问题——大目标占据画面大半,小目标可能只有几个像素,普通模型很难同时精准检测。而MSDA(Multi-Scale Dilated Attention,多尺度空洞注意力)就像给模型配备了“变焦眼镜”,能同时关注不同尺度的目标,让YOLOV12在大、中、小目标检测上都能表现出色。这篇教程会带你从原理到实操,掌握这个强大的注意力机制,让你的检测模型真正“通吃”各种尺度的目标。MSDA的“多尺度空洞注意力”设计,是目标检测突破尺度瓶颈的关键一步。

know_F0727的博客 263

C++继承和虚函数中多态语法及用多态实现计算器类运算(附C++代码)

C++ 多态在面向对象编程中非常重要,用于实现灵活性和扩展性。

qq_40280673的博客 1345

SAPGUI excel 导出时遇到的运行时错误:STRING_SIZE_TOO_LARGE

当报表导出需求远超单一 XLSX 文件的物理承载力时,与其在 SAPGUI 中硬拼 2 GB 限制,不如把分页、过滤、流式写入作为设计前提。掌握 ABAP2XLSX 或 CSV + Power Query 等工具链,既能满足审计合规,又能让应用服务器远离的噩梦。祝你在下一次导出海量数据时,既高效又优雅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 638

「C/C++」C++经验篇 之 开闭原则(Open-Closed Principle, OCP)

假设我们有一个程序,需要计算不同形状(如圆形、矩形)的面积。未来可能新增其他形状(如三角形),要求系统能轻松扩展,而无需修改现有代码。:直接修改源码添加新形状,违反开闭原则。如何让代码更健壮、更易扩展!若需要支持多种数据类型(如。

何曾参静谧的博客 875

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

多态及C++中的多态技术

多态性是面向对象编程中很重要的一个特征,简单理解就是“一个事物,多种形态”。谭浩强的《C++面向对象程序设计》中对多态性的一般性表述是: 向不同对象发送同一消息(调用函数),不同对象会产生不同的行为(即不同的实现) C++中,将多态分为两类,通过指向基类的指针或引用调用虚函数对应的是运行时多态,通过调用重载函数或模板函数对应的是编译时多态。不过,关于重载是否属于多态有两种说法: 说法1 重载...

Blateyang的博客 715

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++多态性定义、实现以及示例详细介绍

C++多态性是面向对象程序设计中的重要概念,它允许子类对象具备父类对象的方法和属性。本文将详细介绍C++多态性的定义、实现以及示例,帮助初学者更好地理解和掌握多态性。

Python966的博客 5752

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++中的 多态

多态的基本、纯虚函数与抽象类、虚析构与纯虚析构

qq_24472227的博客 1034

C++类多态

静态多态和动态多态 以下代码是地址早绑定: #include<iostream> #include<string> using namespace std; class Animal { public: void speak() { cout << "动物在说话" << endl; } }; class Cat :public Animal { void speak() { cout << "猫在说话" <<.

weixin_42989738的博客 824

cpp中的多态

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码。在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容。静态多态:函数重载和运算符重载属于静态多态,复用函数名。2.如果子类中没有堆区数据,可以不写为虚析构或纯虚析构。静态多态的函数地址早绑定 - 编译阶段确定函数地址。动态多态的函数地址晚绑定 - 运行阶段确定函数地址。子类必须重写抽象类中的纯虚函数,否则也属于抽象类。如果是纯虚析构,该类属于抽象类,无法实例化对象。3.拥有纯虚析构函数的类也属于抽象类。

2301_79602614的博客 225

C++中的多态

多态是C++面向对象的三大特性之一多态分为两类:静态多态和动态多态的区别:案例: 总结实现动态多态要满足的条件:多态使用条件:区分重写和重载:定义父类内函数为虚函数时,会创建一个虚函数指针,指向一个虚函数表,在表中保存虚函数的函数入口地址,此时若子类继承该父类,子类中也会复制一份同样的虚函数指针和虚函数表,如下图所示:当子类重写父类的虚函数时,子类虚函数表中的内容会被替换成子类的虚函数地址,如下图所示:示例: 3. 多态案例一:计算器类 案例描述:分别用普通写法和多态技术,设计实现两个操作数进行运

qq_53795212的博客 978

23种设计模式C++实现UML+源码汇总

设计模式-汇总 代码开源仓库地址 23种设计模式C++实现 C++中的开闭原则使用C++多态功能实现附源码 C++基于多态实现依赖颠倒原则附源码 C++ 的静态成员变量为什么一定要在类外定义 23种设计模式C++源码与UML实现–单例模式中的饿汉模式和懒汉模式 c++中的 单例模式(singleton)和双检测锁(Double-Checked Locking) 23种设计模式C++源码与UML实现–简单工厂模式 23种设计模式C++源码与UML实现–工厂模式 23种设计模式C++源码与UML实现–代理模式

andrewbytecoder 2087
上一篇: 23种设计模式C++实现
下一篇: C++基于多态实现依赖颠倒原则附源码
andrewbytecoder
andrewbytecoder 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 3476粉丝 687原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andrewbytecoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值