首页 > 编程语言 >C++ 设计模式——设计模式总结

C++ 设计模式——设计模式总结

时间:2024-09-03 12:20:53浏览次数:6  
标签:总结 定义 对象 C++ 一个 抽象 模式 设计模式

目录

C++ 设计模式——设计模式总结

设计模式是软件设计中常见问题的典型解决方案。它们是经过反复验证的、可重用的代码设计经验,用于解决在特定情境下反复出现的软件设计问题。

1. 面向对象程序设计的几个原则

  • 开放封闭原则 (OCP - Open-Closed Principle):软件实体应当对扩展开放,对修改封闭。这意味着一个实体允许其行为扩展,而无需修改其源代码。
  • 依赖倒置原则 (DIP - Dependency Inversion Principle):高层模块不应依赖低层模块,两者应依赖其抽象;抽象不应依赖细节,细节应依赖抽象。
  • 组合复用原则 (CRP - Composite Reuse Principle):尽量使用对象组合,而不是继承来达到复用的目的。
  • 迪米特法则(LoD - Law of Demeter)/得墨忒法则/最少知识原则(LKP - Least Knowledge Principle):一个对象应该对其他对象有尽可能少的了解。
  • 单一职责原则 (SRP - Single Responsibility Principle):一个类应该仅有一个引起它变化的原因。
  • 里氏替换原则 (LSP - Liskov Substitution Principle):子类型必须能够替换掉它们的父类型。

2. 设计模式的分类

  • 创建型模式——关注对象的创建,把对象的创建和使用分离。创建型模式包括如下设计模式:简单工厂、工厂方法、抽象工厂、原型、建造者、单例。
  • 结构型模式——关注对象之间的关系,研究如何组合各种对象以获得更灵活的结构并达到简化设计的目的。结构型设计模式包括如下设计模式:装饰、外观、组合、享元、代理、适配器、桥接。
  • 行为型模式——关注对象的行为或交互,描述一组对象应如何协作完成一个整体任务。行为型模式包括如下设计模式:模板方法、策略、观察者、命令、迭代器、状态、中介者、备忘录、职责链、访问者、解释器。

3. 设计模式的定义

3.1 创建型设计模式的定义

  • 简单工厂:定义一个工厂类,该类的成员函数可以根据不同参数创建并返回不同的类对象,被创建的对象所属的类一般都具有相同的父类。调用者无须关心创建对象的细节。
  • 工厂方法:定义一个用于创建对象的接口,但由子类决定要实例化的类是哪一个该模式使得某个类的实例化延迟到子类。
  • 抽象工厂:提供一个接口,让该接口负责创建一系列相关或者相互依赖的对象,而无须为它们指定具体的类。
  • 原型:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
  • 建造者:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 单例:保证一个类仅有一个实例存在,同时提供能对该实例访问的全局方法。

3.2 结构型设计模式的定义

  • 装饰:动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更加灵活。
  • 外观:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
  • 组合:将一组对象组织成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的操作/使用/处理具有一致性。
  • 享元:运用共享技术有效地支持大量细粒度的对象(的复用)。
  • 代理:为其他对象提供一种代理以控制对这个对象的访问。
  • 适配器:将一个类的接口转换成客户希望的另外一个接口。该模式使得原本接口不兼容而不能一起工作的类可以一起工作。
  • 桥接:将抽象部分与它的实现部分分离,使它们都可以独立地变化和扩展。

3.3 行为型设计模式的定义

  • 模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中去实现,从而达到在整体稳定的情况下产生一些变化的目的。
  • 策略:定义一系列算法类,将每个算法封装起来,让它们可以相互替换。换句话说策略模式通常把一系列算法封装到一系列具体策略类中,作为抽象策略类的子类然后根据实际需要使用这些子类。
  • 观察者:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会自动得到通知。
  • 命令:将一个请求或者命令封装为一个对象,以便这些请求可以以对象的方式通过参数进行传递,对象化了的请求还可以排队执行或者根据需要将这些请求录入日志供查看和排错,以及支持请求执行后的可撤销操作。
  • 迭代器:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
  • 状态:允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类。
  • 中介者:用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互。
  • 备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
  • 职责链:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它(请求)为止。
  • 访问者:提供一个作用于某对象结构中的各元素的操作表示,使可以在不改变各元素类的前提下定义作用于这些元素的新操作。
  • 解释器:定义一个语言的文法,并建立一个解释器解释该语言中的句子。

4. 重要提示

  • 当系统的设计不需要预留任何弹性时,就不需要使用模式。
  • 模式会带来复杂性和降低程序运行效率,除非必要,否则不要着急使用模式从而引入这种复杂性。
  • 虽然可以发明自己的设计模式,但人们见到的大多数模式都是现有设计模式的变种而不是新模式。
  • 设计模式并不能解决软件开发中的所有问题,是否使用设计模式要具体情况具体分析,要进行权衡。
  • 许多设计模式的UML图看起来很类似,我们更应该关注的是某个模式专注于解决什么样的问题。
  • 仅对程序中呈现出频繁变化的那些部分做出抽象,拒绝不成熟的抽象和抽象本身一样重要。
  • 不写代码的架构师是值得怀疑的架构师。
  • 测试工程师不是发现问题的机器,把明知道有缺陷的代码发送给测试工程师是非常不专业的。发布软件时,应该确保测试工程师找不到问题。

标签:总结,定义,对象,C++,一个,抽象,模式,设计模式
From: https://blog.csdn.net/qq_68194402/article/details/141760945

相关文章

  • 在Linux中使用C++调用Python程序
    为什么要用C++调Python我们训练部署CNN模型时,服务器用Pytorch测试的精度比我们部署端精度高0.5%。经过多方排查,发现是由于Pytorch预处理图片使用PIL进行图片读取和尺寸调整,但是部署端采用OpenCV进行图片读取和尺寸调整。两种实现方式实现的Resize操作差异非常大。为了快速完成项......
  • windows C++ 并行编程-并发的异常处理(三)
    并发运行时使用C++异常处理来传达多种错误。这些错误包括:无效使用运行时、无法获取资源等运行时错误,以及你提供给任务和任务组的工作函数中发生的错误。当任务或任务组引发异常时,运行时会保存该异常并将其编组到等待任务或任务组完成的上下文。对于轻量级任务和代理等组件......
  • 【最新原创毕设】基于微信小程序的老年人健康医疗信息服务平台设计+24246(免费领源码)可
    摘 要老年人健康是社会关注的重点之一,随着我国人口老龄化程度的增加,老年人的健康问题逐渐凸显。为了更好地满足老年人的健康需求,提高医疗服务质量和效率,开发一个基于SpringBoot的老年人健康医疗信息服务平台是十分必要的。老年人健康医疗信息服务平台利用Java语言,通过spring......
  • windows C++ 并行编程-并发的异常处理(二)
    并发运行时使用C++异常处理来传达多种错误。这些错误包括:无效使用运行时、无法获取资源等运行时错误,以及你提供给任务和任务组的工作函数中发生的错误。当任务或任务组引发异常时,运行时会保存该异常并将其编组到等待任务或任务组完成的上下文。对于轻量级任务和代理等组件......
  • C++学习笔记(四)类和对象
    类和对象C++对象模型和this指针成员变量和成员函数的存储C++中的成员变量和成员函数是分开存储的,只有非静态成员变量才属于类的对象上classPerson{intm_Age;//非静态成员变量staticintm_B;//静态成员变量voidfunc(){//不属于类的对象上}staticv......
  • 活动系统开发之采用设计模式与非设计模式的区别-需求整理
    用户需求(活动系统):    1、活动类型:答题、图片展示、签到、抽奖、组团等活动     2、活动介绍:        a、答题活动:                        第一种是签到后,随机抽取10道题,答对8到就可以抽奖;          ......
  • c++入门基础
    欢迎来到c++入门基础的学习目录1、第一个c++程序2、命名空间3、c++的输入与输出4、缺省参数5、函数重载6、详解引用(引用属于重点知识)7、指针与引用的差别8、内联函数9、nullptr在学习c++之前我们要知道c++是什么—c++是c语言的扩展,主要在c语言之上添加了封装、继......
  • 在Java中23种设计模式,分类以及代码示例
    在Java中23种设计模式,分类以及代码示例在Java中,设计模式可以分为23种,以三个不同的分类进行划分。1.创建型模式(CreationalPatterns):单例模式(Singleton)原型模式(Prototype)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)建造者模式(Builder)2.结构型模式(Structura......
  • 读书笔记:高效C/C++调试
    高效C/C++调试(美)严琦、卢宪廷目录第1章调试符号和调试器11.1调试符号11.1.1调试符号概览2全局变量文件行号数据类型1.1.2DWARF格式31.2实战故事1:数据类型的不一致141.3调试器的内部结构161.3.1用户界面161.3.2符号管理模块161.3.3目标管理模块......
  • C++(static_cast)
    目录1.语法2.示例3.为什么选择static_cast总结static_cast是C++中的一种类型转换运算符,用于在不同的数据类型之间进行安全转换。与C风格的强制类型转换不同,static_cast更加安全和明确。它主要用于进行类型转换时,确保转换是合法的,并且不会引入不必要的风险。1.语法......