c++设计模式总结

C++设计模式是一套被广泛认可的用于解决常见对象导向设计问题的最佳实践。设计模式可以帮助开发者编写更加清晰、可维护和可扩展的代码。设计模式通常分为三大类:创建型、结构型和行为型。下面,我将分别介绍这三类设计模式的概念、应用场景和C++实现示例。

创建型设计模式

创建型设计模式关注于对象的创建机制,帮助使系统独立于如何创建、组合和表示对象。

  1. 单例模式(Singleton)

    • 概念:确保一个类只有一个实例,并提供一个全局访问点。
    • 应用场景:当需要控制实例数目,节省系统资源的时候。
    • 示例
      class Singleton {
      private:static Singleton* instance;Singleton() {}
      public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}
      };
      Singleton* Singleton::instance = nullptr;
      
  2. 工厂方法模式(Factory Method)

    • 概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
    • 应用场景:在编程时不知道最终需要创建的对象的具体类型。
    • 示例
      class Product {
      public:virtual ~Product() {}virtual void Operation() = 0;
      };class ConcreteProductA : public Product {
      public:void Operation() override {// 实现代码}
      };class Creator {
      public:virtual ~Creator() {}virtual Product* FactoryMethod() = 0;
      };class ConcreteCreatorA : public Creator {
      public:Product* FactoryMethod() override {return new ConcreteProductA();}
      };
      

结构型设计模式

结构型设计模式关注于如何组合类和对象以获得更大的结构。

  1. 适配器模式(Adapter)
    • 概念:允许将一个类的接口转换成客户期望的另一个接口。
    • 应用场景:当需要使用现有的类,而其接口不符合你的需求时。
    • 示例
      class Target {
      public:virtual ~Target() {}virtual void Request() = 0;
      };class Adaptee {
      public:void SpecificRequest() {// 特定请求}
      };class Adapter : public Target {
      private:Adaptee* adaptee;
      public:Adapter(Adaptee* a) : adaptee(a) {}void Request() override {adaptee->SpecificRequest();}
      };
      

行为型设计模式

行为型设计模式关注于对象之间的职责分配。

  1. 观察者模式(Observer)
    • 概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
    • 应用场景:当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时。
    • 示例
      class Observer {
      public:virtual ~Observer() {}virtual void Update(int) = 0;
      };class Subject {
      public:virtual ~Subject() {}virtual void Attach(Observer*) = 0;virtual void Detach(Observer*) = 0;virtual void Notify() = 0;
      };class ConcreteSubject : public Subject {
      private:std::list<Observer*> observers;int state;
      public:void Attach(Observer* o) override {observers.push_back(o);}void Detach(Observer* o) override {observers.remove(o);}void Notify() override {for (Observer* o : observers) {o->Update(state);}}void SetState(int value) {state = value;Notify();}
      };
      

这些设计模式是C++面向对象设计中的基石,通过它们可以创建灵活、可维护和可扩展的软件。理解和掌握这些模式对于高级C++开发者来说非常重要。

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

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

相关文章

将List转换为数组或者将数组转换为List,如果改变了原始值,转换后的数据会发生改变吗?

将List转换为数组或将数组转换为List涉及到数据结构的变化。在Java中&#xff0c;这两种转换是否会影响原始数据取决于转换的方式和使用的数据结构。下面分别解释这两种情况&#xff1a; 将List转换为数组 当你将一个List转换为数组时&#xff0c;通常通过List的toArray()方法…

CUDA学习笔记04:向量之和

参考资料 CUDA编程模型系列二(向量操作)_哔哩哔哩_bilibili &#xff08;非常好的学习资料&#xff01;&#xff09; vs2019 随意新建一个空项目&#xff0c;按照之前的环境配置配好项目依赖&#xff1a; CUDA学习笔记02&#xff1a;测试程序hello world-CSDN博客 代码结构…

JavaScript的事件初始

JavaScript 的事件初识 基本概念 html和JS做的一个约定。浏览器需要监听用户做了什么样的操作&#xff0c;并对用户的操作进行对应的反馈&#xff0c;从而形成一个动态的页面效果。 用户对于页面的一些操作(点击, 选择, 修改等) 操作都会在浏览器中产生一个个的事件。 事件的三…

《 前端挑战与未来:如何看待“前端已死”》

在技术领域&#xff0c;时常会有一些激进的言论引发热议&#xff0c;比如近年来不少人声称“前端已死”。这样的言论引发了广泛的讨论和反思。本文将从几个方向探讨这个话题&#xff1a;为什么会出现“前端已死”的言论、如何看待这种说法、前端技术的未来发展趋势以及前端人如…

MS8911S/8921S/8922M/8931S——4ns 延时、轨到轨高速比较器

产品简述 MS8911S/MS8921S/MS8922M/MS8931S 是一款具 有内部迟滞的高速比较器。其电源电压范围为 3.0V- 5.5V &#xff0c;输入和输出范围均可做到轨到轨。其输出为推 挽结构&#xff0c;兼容 CMOS/TTL 逻辑电平标准。传输延时为 4ns &#xff0c;且失调电压低。单一比…

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

二维码门楼牌管理系统应用场景:城市规划与土地管理的新利器

文章目录 前言一、城市规划部门的新助手二、门牌数据的深度应用三、支持可持续城市发展四、与城市规划部门的联动 前言 随着科技的不断进步&#xff0c;二维码技术已经深入到我们生活的方方面面。在城市规划与土地管理领域&#xff0c;二维码门楼牌管理系统正成为一项革命性的…

在dockerfile,文件和文件夹打包到镜像中,解决文件夹文件为空的问题

一般来说直接copy就行了&#xff0c;但是不知道为什么看起来是复制过去了&#xff0c;但实际结果总为空。 最后想了一个办法&#xff0c;那就是把要复制的文件夹在外面压缩成压缩包&#xff0c;然后复制进去即可。 以复制模型缓存为例&#xff1a; FROM IMAGE&#xff1a;ve…

【Selenium】UI自动化|元素定位常见问题

1、报错NoSuchElementException——定位不到元素 分析的可能原因&#xff1a; 页面还没有加载出来&#xff0c;就对页面上的元素进行的操作 元素在iframe中&#xff0c;先要理解下frame的实质&#xff0c;frame中实际上是嵌入了另一个页面&#xff0c;而webdriver每次只能在一…

Linux中给复杂命令起别名

目录 1 前言 2 操作步骤 2.1 打开.bashrc 2.2 编辑.bashrc-添加别名 2.3 使别名生效 1 前言 在linux中有些指令会比较长&#xff0c;为了便捷的使用它们&#xff0c;我们就可以采取起别名的方式&#xff0c;具体操作如下。 2 操作步骤 2.1 打开.bashrc 输入如下指令&a…

前端WebRTC局域网1V1视频通话

基本概念 WebRTC&#xff08;Web Real-Time Communications&#xff09; 网络实时通讯&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和音频流或者其他任…

如何在2.2.1版Aduino IDE中开发ESP32

ESP32芯片集成了WIFI和蓝牙&#xff0c;而且关于生态也很不错&#xff0c;越来越多的学习者和开发者选择此类芯片&#xff0c;而不像用keil开发STM32或者51一样&#xff0c;ESP32虽然也有官方的ESP32-IDF开发软甲&#xff0c;但是经过我个人的实操体验&#xff0c;不适合小白或…

每天一个数据分析题(一百八十九)

在线性回归的高斯马尔科夫假设中&#xff0c;以下属于对残差的假设的有&#xff08;&#xff09; A. 残差序列不相关 B. 残差序列方差为1 C. 残差序列为正态分布 D. 残差序列方差相同 题目来源于CDA模拟题库 点击此处获取答案

【数据结构与算法】二叉树解题20240306

这里写目录标题 一、104. 二叉树的最大深度二、100. 相同的树三、226. 翻转二叉树四、101. 对称二叉树 一、104. 二叉树的最大深度 简单 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 1、确定递归…

基于R语言和iris数据集实现随机森林模型及测试应用

基于R语言和iris数据集实现随机森林模型及测试应用 测试应用R代码 #加载随机森林模型库 > library("randomForest") #加载iris数据集 > data(iris) > head(iris)# 设置训练数据和标签 t_data <- iris[, -5] t_labels <- iris[, 5] # 训练随机森…

【Supra空投指南】

一、简介 单号注册并完成kyc最低送490个代币&#xff08;价值200u左右&#xff0c;可多号操作&#xff09;&#xff0c;每周都有任务&#xff08;非常简单&#xff0c;不花时间&#xff09;&#xff0c;随完成任务增多可获得更多空投&#xff0c;3-4月份空投!! 二、操作步骤 …

机器学习-面经(part6、集成学习)

10 集成学习 定义:通过结合多个学习器(例如同种算法但是参数不同,或者不同算法),一般会获得比任意单个学习器都要好的性能,尤其是在这些学习器都是"弱学习器"的时候提升效果会很明显。 10.1 Boosting(提升法) 可以用于回归和分类 问题,它每一…

Jenkins的安装和helloworld Pipeline

文章目录 环境安装下载安装启动初始化 PipelineUISCM&#xff08;Source Control Management&#xff09;准备pipeline 参考 环境 RHEL 9.3Jenkins 2.44.0.1 安装 参考 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 。 下载安装 [ding192 ~]$ sudo …

Elasticsearch搜索引擎

目录 初识elasticsearch 了解ES 什么是elasticsearch elasticsearch的发展 搜索引擎技术排名&#xff1a; 总结 倒排索引 正向索引和倒排索引 正向索引 倒排索引 总结 es的一些概念 文档 索引 概念对比 架构 总结 安装es&#xff0c;kibana 安装es 安装kiba…

中医舌苔笔记

舌诊时按照舌尖-舌中-舌根-舌侧的顺序进行观察。 先看舌体再看舌苔&#xff0c;30秒左右。 如果一次望舌判断不清&#xff0c;可令病人休息3~5分钟后&#xff0c;重新观察一次 舌诊脏腑部位分属图 舌体 胖嫩而边有齿痕为气虚、阳虚。 薄白而润为风寒&#xff1b; 薄白而燥…