C++中的设计模式

要搞清楚设计模式,首先得要了解UML中的类的一些关系模型。

一.UML图中与类的层次关系

UML关系:继承关系(泛化关系);组合关系;聚合关系;关联关系;依赖关系;
以上关系强度 依次减弱。
1.继承关系
继承关系是最直接的父子关系,如麻雀和老鹰都继承自鸟类,属于子类继承自父类,所以UML中子类实线+空心三角箭头指向父类;
2.组合关系
组合关系是某个类是由某些部位组合起来形成,如人和人的手臂,人的心脏,人的脚趾,就是组合关系,而手臂心脏不能离开人独立存活,所以UML图中用 心脏,手臂,脚趾,画直线+实心菱形箭头,指向人的类;
3.聚合关系
聚合关系是多个不同的类作为元素模块聚合成一个新的模块,如森林中包含植物动物阳光等,所以用实线+空心菱形箭头指向森林的类;
4.关联关系
关联关系有单向关联,双向关联,自关联三种,是两个平等的类中包含一种联系,如男人和女人两个类中的有个配偶,就是对方的类对象,所以关联关系用实线+三角箭头指向;
5.依赖关系
依赖关系是原本没有任何联系的两个类,因为某些业务功能需要,一个类依赖另一个类的一些功能,如人的类依赖车的类出行,依赖衣服类保暖,只是为了出行和保暖需要,如果不要这种出行功能,就可以去掉这种依赖关系的,所以是虚线+箭头指向依赖的类;

二.设计模式中的设计原则

1.单一职责原则
每个类都有一个明确的设计职责
2.开放封闭原则
设计要保持开放性,以便扩展,也要关闭修改,以限制代码变动,即类内封闭,类外开放
3.里氏代换原则
子类能替换他的父类型
4.依赖倒转原则
面向接口编程依赖于抽象类而非具体的实现
5.接口隔离原则
接口最小化,仅提供真正需要的接口
6.迪米特法则(最小知道原则)
一个对象不应与其他对象的内部状态发生过多关联

三.设计模式

1.单例模式:

只提供一个实例,对于单个资源处理,不能被继承,没有子类
饿汉模式:直接创建对象,线程安全的
懒汉模式:在使用中创建对象,线程不安全,需要双重检查锁定保证线程安全

2.简单工厂模式

只有一个工厂类
通过多态实现多种产品的生产
不遵循开闭原则

3.工厂模式

遵循开闭原则
有多个工厂类
每个工厂类用于生产专属的产品对象
创建对象的类不需要提供抽象类
通过继承和实现接口来创建不懂的实例对象

4.抽象工厂模式

有多个工厂类
遵循开闭原则
提供一个产品家族的抽象类型
子类定义如何生产出产品的方法

5.策略模式:

定义了一系列算法,并将每个算法封装起来,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理,常用来替换多层if…else,缺点是策略模式只适用于客户端知道所有的算法或行为的情况。
环境类:Context 环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略
Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法
ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

6.模板模式

定义一系列抽象的流程步骤
流程步骤在不同的子类种被重写以实现其不同展现
如果父类中某些流程步骤可变的方法太多,会导致其实现的子类就相应增加

7.原型模式

父类指向子类的拷贝构造
子类通过接口返回一个自己的实例对象
常用于克隆多个实例(不同子类)

8.组合模式

子节点跟随父节点一起销毁

9.聚合模式

子节点不跟随父节点一起销毁,可以独立生存

10.外观模式

上层接口:给很多复杂的子系统提供一个简单的上层接口,并在这些接口中包含用户真正关心的功能
底层模块:做好各个后台功能
底层模块与上层调用是一种关联关系

11.观察者模式

又叫订阅模式,两个类分别是观察者和被观察者,互相包含
被观察者include所有观察者(或者其抽象),并在类中提供添加和去除订阅者接口来维护一个列表保存所有观察者,并实现一个通知消息的接口,当某个状态变化需要通知订阅者时,变通过通知消息接口,调用各个观察者的响应接口;
观察者(订阅者)通过include被观察者(获取抽象类),调用其添加和去除订阅者的接口来实现参与订阅和取消订阅,并实现一个接收消息通知的对外接口,以供被观察者调用来发送消息。

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

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

相关文章

vue中实现button按钮的重复点击指令

// 注册一个全局自定义指令 v-debounce Vue.directive(debounce, {// 当被绑定的元素插入到 DOM 中时...inserted: function (el, binding) {let timer;el.addEventListener(click, () > {clearTimeout(timer);timer setTimeout(() > {binding.value(); // 调用传给指令…

IO、零拷贝、多路复用、connection、池化

目录 一、IO 模型 二、什么是网络IO 三、什么是零拷贝 四、多路复用 五、java程序、mysql JDBC connection关系 六、connection怎么操作事务 七 、java里面的池化技术 八、线程池7个核心参数 九、线程的状态 一、IO 模型 BIO :同步阻塞io,单线程 内存上下…

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …

A35 STM32_HAL库函数 之PCD通用驱动 -- A -- 所有函数的介绍及使用

A35 STM32_HAL库函数 之PCD通用驱动 -- A -- 所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_PCD_Init1.2 HAL_PCD_DeInit1.3 HAL_PCD_MspInit1.4 HAL_PCD_MspDeInit1.5 HAL_PCD_Start1.6 HAL_PCD_Stop1.7 HAL_PCD_IRQHandler1.8 HAL_PCD_DataOutStageCallback1.9 HAL_PCD_Data…

基于机器学习(支持向量机,孤立森林,鲁棒协方差与层次聚类)的机械振动信号异常检测算法(MATLAB 2021B)

机械设备异常检测方法流程一般如下所示。 首先利用传感器采集机械运行过程中的状态信息&#xff0c;包括&#xff0c;振动、声音、压力、温度等。然后采用合适的信号处理技术对采集到机械信号进行分析处理&#xff0c;提取能够准确反映机械运行状态的特征。最后采用合理的异常决…

C++ 什么是虚函数?什么是纯虚函数,以及区别?(通俗易懂)

&#x1f4da; 当谈到虚函数时&#xff0c;通常是指在面向对象编程中的一种机制&#xff0c;它允许在派生类中重写基类的函数&#xff0c;并且能够通过基类指针或引用调用派生类中的函数。 目录 前言 &#x1f525; 虚函数 &#x1f525; 纯虚函数 &#x1f525; 两者区别…

洛谷 P1032 [NOIP2002 提高组] 字串变换

P1032 [NOIP2002 提高组] 字串变换 - 洛谷 | 计算机科学教育新生态 题目来源 洛谷 题目内容 [NOIP2002 提高组] 字串变换 题目背景 本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水&#xff0c;各种做法都可以通过&#xff0c;不代表算法正确。因此本题题目和…

mac|idea导入通义灵码插件

官方教程&#xff1a;通义灵码下载安装指南_智能编码助手_AI编程_云效(Apsara Devops)-阿里云帮助中心 下载插件&#xff1a; ⇩ TONGYI Lingma - JetBrains 结果如下&#xff1a; 选择apply、ok&#xff0c;会出现弹窗&#xff0c;点击登录 可以实现&#xff1a;生成单元测…

《C++20设计模式》代理模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 这代理模式和装饰器模式很像啊。都是套一层类。&#x1f630; 主要就是功能差别 装饰器&#xff1a; 为了强化原有类的功能。代理模式&#xff1a; 不改变原有功能&#xff0c;只是强化原有类的潜在行为。 我觉的书上有…

【基于R语言群体遗传学】-8-代际及时间推移对于变异的影响

上一篇博客&#xff0c;我们学习了在非选择下&#xff0c;以二项分布模拟遗传漂变的过程&#xff1a;【基于R语言群体遗传学】-7-遗传变异&#xff08;genetic variation&#xff09;-CSDN博客 那么我们之前有在代际之间去模拟&#xff0c;那么我们就想知道&#xff0c;遗传变…

KVM虚机调整磁盘大小(注:需重启虚拟机)

1、将磁盘大小由15G调整为25G [rootkvm ~]# virsh domblklist kvm-client #显示虚拟机硬盘列表 [rootkvm ~]# qemu-img resize /var/lib/libvirt/images/tesk-disk.qcow2 10G #扩容 [rootkvm ~]# qemu-img info /var/lib/libvirt/images/test-disk.qcow2 #查看信息 注&…

奥威BI方案:多行业、多场景,只打高端局

奥威BI方案&#xff0c;确实以其卓越的性能和广泛的应用领域&#xff0c;在高端数据分析市场中占据了一席之地。以下是对奥威BI方案的详细解析。 奥威BI方案是一款针对多行业、多场景的全面数据分析解决方案&#xff0c;它结合了大数据、云计算等先进技术&#xff0c;为企业提…

LeetCode:3101. 交替子数组计数(Java 找规律)

目录 3101. 交替子数组计数 题目描述&#xff1a; 实现代码与解析&#xff1a; 简洁版&#xff1a; 原理思路&#xff1a; 3101. 交替子数组计数 题目描述&#xff1a; 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们…

看互联网大厂如何落地AI-Agent(3)

vivo一站式AI智能体构建平台的演进实践 引言 在AI技术的浪潮中&#xff0c;vivo互联网产品平台架构团队负责人张硕分享了vivo在构建一站式AI智能体平台方面的演进实践和深刻洞见。 背景与挑战 vivo面临的挑战包括创造商业价值、降低学习成本、合规性、以及LLM&#xff08;大…

hnust 1816: 算法10-9:简单选择排序

hnust 1816: 算法10-9&#xff1a;简单选择排序 题目描述 选择排序的基本思想是&#xff1a;每一趟比较过程中&#xff0c;在n-i1(i1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。 在多种选择排序中&#xff0c;最常用且形式最为简单的是简单选择排序。…

FFmpeg常用命令手册

官方文档&#xff1a;ffmpeg Documentation 常规选项 -i input_url 输入文件或者输入流的路径 Main 选项 -f fmt (input/output) 强制指定输入或输出文件的格式&#xff0c; 常见的格式名称包括flv&#xff0c;mp4、hls、mpegts、avi、mov -c[:stream_specifier] codec (i…

收银系统源码-收银台副屏广告

1. 功能描述 门店广告&#xff1a;双屏收银机&#xff0c;副屏广告&#xff0c;主屏和副屏同步&#xff0c;总部可统一控制广告位&#xff0c;也可以给门店开放权限&#xff0c;门店独立上传广告位&#xff1b; 2.适用场景 新店开业、门店周年庆、节假日门店活动宣传&#x…

【HICE】DNS反向解析

反向解析&#xff1a;IP ----> 主机名 1.更改主配置文件 2.:更改反向的信息 3.重启服务 4.测试解析是否成功

聊天服实现设计

聊天服拓扑关系 聊天服独立于游戏服&#xff0c;客户端直连聊天服客户端按 PlayerID 散列&#xff0c;连接聊天服有涉及扣道具才能发言的等&#xff08;必须依赖游戏服功能的&#xff09;&#xff0c;先走游戏服&#xff0c;其他均可以直接走聊天服 聊天频道 - 世界频道 客户…