面向对象的基本概念

面向对象的分析(OOA):找到需求,分析出需要,要干什么

面向对象的设计(OOD):将需求转换为类,设计出类中的数据成员,成员函数,以及类与类之间的关系。使用设计原则设计出更加健壮的代码。

面向对象的编程(OOP):将面向对象的设计与分析出来的需求转换为代码。

统一建模语言:UML语言。

类与类之间的关系

1.继承

派生类会继承基类,吸收基类中的数据成员与部分成员函数,基类部分会成为派生类的一部分,在语义层面上:A is B.在类图的画法上,可以从派生类指向基类的空心三角箭头。

image-20240702112024139

继承:先有基类,然后派生出新的类,也就是派生类。即:现有基类然后才有派生类

泛化(一般化):先又派生类,然后再抽象出基类。即:现有派生类然后才有基类

2.关联

双向的关联关系

彼此知道对方的存在,但是彼此并不负责对方的生命周期,在代码层面上体现是,使用的是指针或者引用,再语义层面上:A has B.在类图的画法上,直接使用的是实心直线。

image-20240702113522873

单向的关联关系

A知道B的存在,但是B并不知道A的存在,这就是单向的关联关系。A并不负责B的生命周期,在代码层面上体现的是:使用指针或者引用,再语义层面上:A has B 再类图的画法上:从A指向B的直线箭头

image-20240702114305291

3.聚合

是一种稍微强一点的关联关系,会分为整体与局部之间的区别,整体部分并不会负责局部对象的销毁。在代码层面上体现:使用的指针或者引用,在语义层面上:A has B.在类图的画法上,使用的是从局部指向整体的空心菱形箭头。

image-20240702114912771

4.组合

是一种最强的关联关系,表现为整体和局部的关系,但是整体会负责局部对象的销毁,在代码层面上的体现:使用的是子对象。在语义层面表现为:A Has B 在类图的画法上:使用局部指向整体的实心菱形箭头

image-20240702143132298

5.依赖

是两个类之间的一种不确定的关系,语义上是一种:A use B,这种关系是偶然的,临时的,并非固定的,在代码层面上表现为:

  • B作为A的成员函数参数;
  • B作为A的成员函数的局部变量(B作为A的成员函数的返回值)
  • A的成员函数调用B的静态方法

在类图的画法上是:A指向B的一个虚线箭头

image-20240702143915022

依赖B并没有作为A的数据成员,在成员函数上产生联系

总结

  1. 继承是一个垂直关系。(上下关系,现有父亲再有儿子,现有基类再有派生类),其他四种是横向关系
  2. 从语义角度,继承:is 关联、聚合、组合:has 依赖关系:use
  3. 耦合强弱,两个类型从弱到强:依赖 < 关联 <聚合 <组合 < 继承
  4. 三种关联关系: 关联 、聚合、组合强调的是数据成员的关系。依赖:从成员函数的角度进行考虑。继承既有数据成员,也有成员函数。

面向对象的设计原则

满足的要求:低耦合,高内聚

耦合:类与类之间,或者模块与模块之间的关系。高内聚:强调的是类内部或者模块内部的关系。(尽量让函数,类,模块实现的功能更简单,同一个模块,类,函数尽量只做一个事情)

1.单一职责原则

核心思想:一个类,最好只做一件事情,只有一个引起它变化的原因

pkg4MWT.png

pkg41lF.png

2.开闭原则

核心思想:对抽象编程,而不是对具体编程,因为抽象相对稳定。

pkg43y4.png

pkg4Jm9.png

3.里氏替换原则

核心思想:派生类必须能够替换其基类,
表现为

  • 派生类可以实现基类的抽象方法,表现为多态
  • 但不能覆盖基类的非抽象方法(C++中的隐藏,要消除C++中隐藏的现象)
  • 派生类可以有自己的个性

pkg4BlD.png

pkg4rOH.png

4.接口分离原则

核心思想:使用多个小的专门的接口,而不要使用一个大的接口

pkg4ymd.png

5.依赖倒置原则

核心思想:面向接口编程,依赖于抽象

跟开闭原则基本一致,都是 面向抽象进行编程

在大多数情况下,开闭原则,里氏替换原则和依赖倒置原则会同时出现,开闭原则是目标,里氏替换原则是基础,依赖倒置原则是手段

pkg42kt.png

6.迪米特原则

也成为最少知道原则,核心思想:尽量的降低类与类、模块与模块之间的耦合程度。

79441c8359f2b25c0d7abc3f538051c7.png

7.组合复用原则

核心思想:在复用时尽量使用组合、聚合关系(关联关系),少用继承

fbd47d2e522b199d7310fadea0decf46.png

设计模式

1.基本概念

他是解决特定问题的一系列套路,有一定的普遍性,它可以提高代码的可重用性,代码的可读性,可靠性以及可扩展性

2.分类

提供对象创建机制,增加现有代码的灵活性和重用性。

分为创造型模式,结构型模式,行为型模式