C++ 设计模式 开放封闭原则 简单示例
C++ 设计模式 开放封闭原则 简单示例
开放封闭原则(Open Closed Principle)描述
符合开放封闭原则的模块都有两个主要特性:
1. 它们 "面向扩展开放(Open For Extension)"。
也就是说模块的行为是能够被扩展的。当应用程序的需求变化时,我们可以使模块表现出全新的或与以往不同的行为,以满足新的需求。
2. 它们 "面向修改封闭(Closed For Modification)"。
模块的源代码是不能被侵犯的,任何人都不允许修改已有源代码。
类关系示意图:

/*
* 开放封闭原则(OCP, Open For Extension, Closed For Modification Principle)
* 软件实体(类、模块、函数等)应对扩展开放,但对修改封闭。
*
*/ #include <iostream> class Banker
{
public:
// 抽象类的构造函数不能是虚函数, 因为虚函数的实现依赖于虚函数表, 在对象没有构造好之前, 对象自己所要占用的空间还是一片混沌, 自己的虚函数表是没法用的
// 在构造函数中调用虚函数, 实际执行的是父类的对应函数, 因为自己还没有构造好, 多态是被关闭的
Banker()
{
std::cout << "构造 Banker" << std::endl;
}
// 抽象类的析构函数通常为虚函数, 否则可能导致资源泄漏, 非纯虚函数必须有定义体, 否则编译错误
// 析构函数可以是纯虚函数, 但纯虚析构函数必须有定义体, 因为析构函数的调用是在子类中隐含的
virtual ~Banker()
{
std::cout << "析构 Banker" << std::endl;
}
// 包含纯虚函数的类, 是一个抽象类, 将不能实例化对象
// 虚函数是动态绑定的, 也就是说, 使用虚函数的指针和引用能够正确找到实际类的对应函数, 而不是执行定义类的函数
// 在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。这样的类型称为协变返回类型(Covariant returns type).
// 派生类的override虚函数定义必须和父类完全一致, 除了一个特例, 如果父类中返回值是一个指针或引用, 子类override时可以返回这个指针(或引用)的派生
virtual void doWorks() = ;
}; class FunkuanBanker: public Banker
{
public:
FunkuanBanker()
{
std::cout << "构造 FunkuanBanker" << std::endl;
}
virtual ~FunkuanBanker()
{
std::cout << "析构 FunkuanBanker" << std::endl;
}
virtual void doWorks() override
{
std::cout << "我是银行业务员-负责【付款】业务" << std::endl;
}
}; class QukuanBanker: public Banker
{
public:
QukuanBanker()
{
std::cout << "构造 QukuanBanker" << std::endl;
}
virtual ~QukuanBanker()
{
std::cout << "析构 QukuanBanker" << std::endl;
}
virtual void doWorks() override
{
std::cout << "我是银行业务员-负责【取款】业务" << std::endl;
}
}; class ZhuanzhangBanker: public Banker
{
public:
ZhuanzhangBanker()
{
std::cout << "构造 ZhuanzhangBanker" << std::endl;
}
virtual ~ZhuanzhangBanker()
{
std::cout << "析构 ZhuanzhangBanker" << std::endl;
}
virtual void doWorks() override
{
std::cout << "我是银行业务员-负责【转账】业务" << std::endl;
}
}; class PiliangZhuanzhangBanker: public ZhuanzhangBanker
{
public:
PiliangZhuanzhangBanker()
{
std::cout << "构造 PiliangZhuanzhangBanker" << std::endl;
}
virtual ~PiliangZhuanzhangBanker()
{
std::cout << "析构 PiliangZhuanzhangBanker" << std::endl;
}
virtual void doWorks() override
{
std::cout << "我是银行业务员-负责【批量转账】业务" << std::endl;
}
}; class ZidongPiliangZhuanzhangBanker: public PiliangZhuanzhangBanker
{
public:
ZidongPiliangZhuanzhangBanker()
{
std::cout << "构造 ZidongPiliangZhuanzhangBanker" << std::endl;
}
virtual ~ZidongPiliangZhuanzhangBanker()
{
std::cout << "析构 ZidongPiliangZhuanzhangBanker" << std::endl;
}
virtual void doWorks() override
{
std::cout << "我是银行业务员-负责【自动批量转账】业务" << std::endl;
}
}; class JijingBanker: public Banker
{
public:
JijingBanker()
{
std::cout << "构造 JijingBanker" << std::endl;
}
virtual ~JijingBanker()
{
std::cout << "析构 JijingBanker" << std::endl;
}
virtual void doWorks() override
{
std::cout << "我是银行业务员-负责【基金】业务" << std::endl;
}
}; class OtherBanker: public Banker
{
public:
OtherBanker()
{
std::cout << "构造 OtherBanker" << std::endl;
}
virtual ~OtherBanker()
{
std::cout << "析构 OtherBanker" << std::endl;
}
virtual void doWorks() override
{
std::cout << "我是银行业务员-负责【其他】业务" << std::endl;
}
}; void HowDo(Banker *pbk)
{
pbk->doWorks();
} void OCP_test()
{
Banker *pbk = nullptr; pbk = new FunkuanBanker;
HowDo(pbk);
delete pbk;
pbk = nullptr; pbk = new QukuanBanker;
HowDo(pbk);
delete pbk;
pbk = nullptr; pbk = new ZhuanzhangBanker;
HowDo(pbk);
delete pbk;
pbk = nullptr; pbk = new PiliangZhuanzhangBanker;
HowDo(pbk);
delete pbk;
pbk = nullptr; pbk = new ZidongPiliangZhuanzhangBanker;
HowDo(pbk);
delete pbk;
pbk = nullptr; return;
} int main()
{
OCP_test(); system("pause");
return ;
}
运行结果:

C++ 设计模式 开放封闭原则 简单示例的更多相关文章
- C++ 设计模式 依赖倒置原则 简单示例
C++ 设计模式 依赖倒置原则 简单示例 /** * 依赖倒置原则(Dependency Inversion Principle) * 依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程 ...
- 北风设计模式课程---开放封闭原则(Open Closed Principle)
北风设计模式课程---开放封闭原则(Open Closed Principle) 一.总结 一句话总结: 抽象是开放封闭原则的关键. 1."所有的成员变量都应该设置为私有(Private)& ...
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...
- 《大话设计模式》num03-04-05---单一职责原则、开放封闭原则、依赖倒转原则
2018年03月03日 21:19:19 独行侠的守望 阅读数个人分类: 设计模式 版权声明:本文为博主原创文章,转载请注明文章链接. https://blog.csdn.net/xiaoanzi12 ...
- 设计模式六大原则——开放封闭原则(OCP)
什么是开闭原则? 定义:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改. 开闭原则主要体现在两个方面: 1.对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况. ...
- [Python设计模式] 第3~5章 单一职责原则/开放-封闭原则/依赖倒转原则
github地址:https://github.com/cheesezh/python_design_patterns 单一职责原则 就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责 ...
- 开放封闭原则(Open Closed Principle)
在面向对象的设计中有很多流行的思想,比如说 "所有的成员变量都应该设置为私有(Private)","要避免使用全局变量(Global Variables)",& ...
- Observer观察者模式与OCP开放-封闭原则
目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...
- (转) 面向对象设计原则(二):开放-封闭原则(OCP)
原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...
随机推荐
- 指定路径下建立Access数据库并插入数据
今天刚刚开通博客,想要把我这几天完成小任务的过程,记录下来.我从事软件开发的时间不到1年,写的不足之处,还请前辈们多多指教. 上周四也就是2016-04-14号上午,部门领导交给我一个小任务,概括来讲 ...
- ASP.NET Core 认证与授权[2]:Cookie认证
由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用户状态,而最常用,也最简单的就是Cookie了,它由浏览器自动保存并在发送请求时自动附加到请求头中.尽管在现代Web应用中,Coo ...
- Cookie实现登录记住密码
Cookie实现记住登录密码,用户可以自由选择是否记住密码,或者用户之前选择记住了,但是某一次又不想记住了,需要将之前对应的Cookie删除掉 Cookie相当于map 也是键值对的形式,但是并不相同 ...
- EOutOfResources字符异常
近日,用Delphi编程时,遇到一个莫名其妙的异常:EOutOfResources,这是一个可以重复再现的异常.开始以为是程序中创建的对象太多,导致占用了过多的资源,引起了这个异常.于是在代码中将许多 ...
- Jenkins 在声明式 pipeline 中并行执行任务
在持续集成的过程中,并行的执行那些没有依赖关系的任务可以缩短整个执行过程.Jenkins 的 pipeline 功能支持我们用代码来配置持续集成的过程.本文将介绍在 Jenkins 中使用声明式 pi ...
- Docker 最常用的监控方案 - 每天5分钟玩转 Docker 容器技术(78)
当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越重要. 在本章中,我们将讨论几个目前比较常用的容器监控工具和方案,为大家构建自己的监控系统提供参考. 首先我们会讨 ...
- YYModel学习总结YYClassInfo(1)
OC的run-time 机制,简直像是网络上的猫! 我在开发中很少用到,但是作为iOS开发 人家肯定会问这个东西,所以深入的学习了下. 对于 run-time的入手,YYModel的学习,简直让人美滋 ...
- 学习总结---SNAT和DNAT
1.SNAT是结合源ip+源端口号变化的NAT功能. DNAT是将目的ip直接转换成私有的目的ip.(是否转换目的端口号?) 2.SNAT的应用场景:公司内部访问互联网时,使用公共的公网ip.从内到外 ...
- 索引节点inode详解
Inode(index node),索引节点.Linux系统中,分区要进行格式化,创建文件系统.在每个Linux存储设备或存储设备的分区(可以是硬盘,软盘,U盘等)被格式化为ext3文件系统后,一般分 ...
- 用git上传代码到新浪云
新浪云空间是国内免费的一个空间,不过有限制很多. 申请新浪云需要新浪账号,注册略. 使用新浪账号去http://sae.sina.com.cn申请一个空间 选择新建应用 可以选择使用php项目 管理应 ...