面向对象编程
面向对象的基本概念
面向对象的分析(OOA):找到需求,分析出需要,要干什么
面向对象的设计(OOD):将需求转换为类,设计出类中的数据成员,成员函数,以及类与类之间的关系。使用设计原则设计出更加健壮的代码。
面向对象的编程(OOP):将面向对象的设计与分析出来的需求转换为代码。
统一建模语言:UML语言。
类与类之间的关系
1.继承
派生类会继承基类,吸收基类中的数据成员与部分成员函数,基类部分会成为派生类的一部分,在语义层面上:A is B.在类图的画法上,可以从派生类指向基类的空心三角箭头。
继承:先有基类,然后派生出新的类,也就是派生类。即:现有基类然后才有派生类
泛化(一般化):先又派生类,然后再抽象出基类。即:现有派生类然后才有基类
2.关联
双向的关联关系
彼此知道对方的存在,但是彼此并不负责对方的生命周期,在代码层面上体现是,使用的是指针或者引用,再语义层面上:A has B.在类图的画法上,直接使用的是实心直线。
单向的关联关系
A知道B的存在,但是B并不知道A的存在,这就是单向的关联关系。A并不负责B的生命周期,在代码层面上体现的是:使用指针或者引用,再语义层面上:A has B 再类图的画法上:从A指向B的直线箭头
3.聚合
是一种稍微强一点的关联关系,会分为整体与局部之间的区别,整体部分并不会负责局部对象的销毁。在代码层面上体现:使用的指针或者引用,在语义层面上:A has B.在类图的画法上,使用的是从局部指向整体的空心菱形箭头。
4.组合
是一种最强的关联关系,表现为整体和局部的关系,但是整体会负责局部对象的销毁,在代码层面上的体现:使用的是子对象。在语义层面表现为:A Has B 在类图的画法上:使用局部指向整体的实心菱形箭头
5.依赖
是两个类之间的一种不确定的关系,语义上是一种:A use B,这种关系是偶然的,临时的,并非固定的,在代码层面上表现为:
- B作为A的成员函数参数;
- B作为A的成员函数的局部变量(B作为A的成员函数的返回值)
- A的成员函数调用B的静态方法
在类图的画法上是:A指向B的一个虚线箭头
依赖B并没有作为A的数据成员,在成员函数上产生联系
总结
- 继承是一个垂直关系。(上下关系,现有父亲再有儿子,现有基类再有派生类),其他四种是横向关系
- 从语义角度,继承:is 关联、聚合、组合:has 依赖关系:use
- 耦合强弱,两个类型从弱到强:依赖 < 关联 <聚合 <组合 < 继承
- 三种关联关系: 关联 、聚合、组合强调的是数据成员的关系。依赖:从成员函数的角度进行考虑。继承既有数据成员,也有成员函数。
面向对象的设计原则
满足的要求:低耦合,高内聚
耦合:类与类之间,或者模块与模块之间的关系。高内聚:强调的是类内部或者模块内部的关系。(尽量让函数,类,模块实现的功能更简单,同一个模块,类,函数尽量只做一个事情)
1.单一职责原则
核心思想:一个类,最好只做一件事情,只有一个引起它变化的原因
2.开闭原则
核心思想:对抽象编程,而不是对具体编程,因为抽象相对稳定。
3.里氏替换原则
核心思想:派生类必须能够替换其基类,
表现为
- 派生类可以实现基类的抽象方法,表现为多态
- 但不能覆盖基类的非抽象方法(C++中的隐藏,要消除C++中隐藏的现象)
- 派生类可以有自己的个性
4.接口分离原则
核心思想:使用多个小的专门的接口,而不要使用一个大的接口
5.依赖倒置原则
核心思想:面向接口编程,依赖于抽象
跟开闭原则基本一致,都是 面向抽象进行编程
在大多数情况下,开闭原则,里氏替换原则和依赖倒置原则会同时出现,开闭原则是目标,里氏替换原则是基础,依赖倒置原则是手段
6.迪米特原则
也成为最少知道原则,核心思想:尽量的降低类与类、模块与模块之间的耦合程度。
7.组合复用原则
核心思想:在复用时尽量使用组合、聚合关系(关联关系),少用继承
设计模式
1.基本概念
他是解决特定问题的一系列套路,有一定的普遍性,它可以提高代码的可重用性,代码的可读性,可靠性以及可扩展性
2.分类
提供对象创建机制,增加现有代码的灵活性和重用性。
分为创造型模式,结构型模式,行为型模式