C++设计模式(李建忠主讲)-1.设计模式简介 总结

2023-11-07 14:59

本文主要是介绍C++设计模式(李建忠主讲)-1.设计模式简介 总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++设计模式-设计模式简介

  • 课程目标
  • GOF设计模式
  • 深入理解面向对象
  • 软件设计复杂的根本原因
  • 解决复杂性的方法
  • 使用抽象的好处
  • 软件设计的目标

课程目标

  • 理解松耦合设计思想
  • 掌握面向对象设计原则
  • 掌握重构技法改善设计
  • 掌握GOF核心设计模式

GOF设计模式

  • 历史性著作《设计模式:可复用面向对象软件的基础》,描述了23中经典面向对象设计模式,创立了模式在软件设计中的地位
  • 通常说的设计模式都隐含地表示“面向对象设计模式”

深入理解面向对象

  • 向下:深入理解面向对象机制
    • 封装:隐藏内部实现
    • 继承:复用现有代码
    • 多态:改写对象行为
  • 向上:深刻把握面向对象机制所带来的抽象意义,理解如何使用这些机制来表达现实世界,掌握什么是“好的面向对象设计”

软件设计复杂的根本原因

  • 变化
    • 客户需求的变化
    • 技术平台的变化
    • 开发团队的变化
    • 市场环境的变化

解决复杂性的方法

  • 分解

    • 分而治之,将大问题分解为多个小问题,将复杂问题分解成多个简单问题
      分解的例子:
      对于不同的形状定义不同的类型
      图1
      在MainForm类中存放不同类型的vector
      图2
      图3
      图4
      在OnPaint方法中根据不同的形状去绘画
      图5
      图6
  • 抽象

    • 人们处理复杂性有一个通用的技术,即抽象。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。
      定义虚基类,在从该虚基类派生出不同的形状,每个形状都有各自的Draw()方法
      图7
      图8
      在MainForm类中只有vector<Shape *>shapeVector,可以放不同形状的指针,注意这里只能有Shape *,而不能用Shape
      图9
      图10
      图11
      在OnPaint()方法中实现多态调用
      图12

使用抽象的好处

在上面的例子中,当增加新的需求画出圆时,

  • 对于第一种写法,需要写一个Class Circle,再在MainForm类中增加一个vector<Circle> circleVector的数据成员,在OnMouseUp()中要push_back相应的Circle对象,再在OnPaint()方法中针对圆写具体的绘制方法。
  • 对于第二种写法,同样也需要定义一个Class Circle,它继承自Class Sharp,我们重写它的Draw方法,而对于MainForm类不需要改动,这样明显提高了代码的复用性。

软件设计的目标

  • 复用

这篇关于C++设计模式(李建忠主讲)-1.设计模式简介 总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/364420

相关文章

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u