首页 > 编程语言 >C++中的设计模式

C++中的设计模式

时间:2024-07-06 17:28:41浏览次数:11  
标签:关系 子类 观察者 接口 算法 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被观察者(获取抽象类),调用其添加和去除订阅者的接口来实现参与订阅和取消订阅,并实现一个接收消息通知的对外接口,以供被观察者调用来发送消息。

标签:关系,子类,观察者,接口,算法,C++,模式,设计模式
From: https://blog.csdn.net/qianniulaoren/article/details/140228773

相关文章

  • 详解C++完美转发
    我们先来看折叠规则引用折叠规则在C++中,引用折叠规则的主要目的是为了保证在模板推导过程中,对于参数T&&能够正确地推导出其最终的引用类型,以便进行参数传递时的正确行为。下面是引用折叠规则的总结:左值引用折叠:T&&折叠为T&T&&&折叠为T&这意味着如果一个左值引用......
  • C++语言常见错误分析汇总
    在一个工程里出现两个main函数时3.obj:errorLNK2005:_mainalreadydefinedinfile1.objDebug/HELLO.exe:fatalerrorLNK1169:oneormoremultiplydefinedsymbolsfound这个就是说,你的main函数重定义了。你看看是不是你的工程里面,包含了很多个有main函数的文件?......
  • c++基础知识——常量和变量
    常量1.常量的性质在程序运行的过程中,其值不改变的量称为常量。常量分为两种:一类直接写出它的值,称为字面值常量,如123,'abc',true等;一类是使用const修饰的对象。2.整形字面值常量整形字面值常量采用我们平常使用的十进制整数表示。如138,0,-512等,都是整形常量,二18.1,32.6等不是整......
  • 【C/C++ new/delete和malloc/free的异同及原理】
    new/delete和malloc/free都是用于在C++(以及C语言在malloc/free的情况下)中动态申请和释放内存的机制,但它们之间存在一些显著的异同点。以下是对这两组函数/运算符的异同点的详细分析:相同点目的相同:两者都用于在堆(heap)上动态地分配和释放内存。手动管理:无论是new/delete还是......
  • 快速排序c++&&java代码实现
    快速排序的思想(基于分治法): 每次选一个基准元素x,通过一次遍历将排序表划分为独立的两部分a[l,k-1],a[k+1,r];其中左边的元素<=x,右边的1元素>x,然后递归下去,直到每个块的大小为1;c++#include<bits/stdc++.h>usingnamespacestd;voidquickSort(vector<int>&q,int......
  • java学习——基础语法篇(适合已经学过c++的人群)
    本篇适合之前学过c和c++语言,现在要学java的人进行学习。由于之前学习过c++同为面向对象的程序语言,基础语法在相对比之下学习,对比c++与java的差异,会快速掌握基本语法。学编程语言,语法不是重点,用时即查,编程思路才是重点。1.注释、标识符、关键字、数据类型,变量定义,运算符与c++基本......
  • 初始C++
    1.visualstudio2022创建项目以及创建C++文件完成上述步骤之后我们就可以敲代码了!!2.关于编译和链接1.ctrl+F7对当前C++文件进行编译并会在编译成功后生成.obj文件。2.F5运行整个项目就会将一个项目下的所有C++文件进行编译再将编译后生成的.obj文件链接起来生......
  • 【C++】认识使用string类
    【C++】STL中的string类C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数遍历string下标+[]迭代器范围for反向迭代器capacitysizelengthmax_sizeresi......
  • C++容器map的常见用法
    文章目录1.map和multimap容器1.map容器的构造和赋值1.构造函数2.赋值操作2.map容器的大小和交换1.获取大小2.交换内容3.map容器的插入和删除1.插入元素2.删除元素3.注意事项4.map容器的查找和统计1.查找元素2.统计元素3.示例5.map容器的排序1.自定义排序规则2.注意点......
  • C++:win11下的VScode构建百度Comate
    一. VScode的安装官网下载地址:https://code.visualstudio.com/ (选择好对应的系统版本)汉化:安装完软件后,打开软件界面的"扩展商店",搜索Chinese,下载相应的插件,如下图:二. 配置C++开发环境VSCode只是一个高级的编辑器,可以用来写C++代码,不能直接编译代码。所以,如果......