1. 面向对象的概念
- 面向对象分析(OOA):做什么,需求是什么
- 面向对象的设计(OOD):怎么做
-
面向对象的编程(OOP):代码的实现
-
UML:统一建模语言
软件是一直都在变化的,但是要以最小的代价满足变化。
2. 类与类之间的关系
2.1 继承(泛化)
- 定义:从派生类向基类发出一个空心三角箭头,基类部分成为派生类的一部分
- 在语义上:A is B
- 在代码上:
- 继承:先有基类,然后再去派生出新的类,也就是派生类
- 泛化:先有派生类,然后将相同的属性抽出来,形成基类
2.2 关联
- 定义:彼此并不负责对方的生命周期
- 在语义上:A has B
- 在代码上:指针或者引用
- 双向的关联关系:使用的是实线
- 单向的关联关系:使用的是实线箭头
2.3 聚合
- 定义:使用从部分指向整体的空心菱型箭头,整体不负责部分的生命周期,是一种比较强的关联关系
- 在语义上:A has B
- 在代码上:使用指针或者引用
2.4 组合
- 定义:使用从部分指向整体的实心菱型箭头。表现为整体与部分的关系,并且整体会负责局部的销毁,是一种最强的关联关系
- 在语义上:A has B
- 在代码上:使用子对象的形式
2.5 依赖
- 定义:虚线箭头。是偶然的,临时的,并非固定的
- 在语义上:A use B
- 在代码上:B作为A的成员函数参数;B作为A的成员函数的局部变量(B作为A的成员函数返回值);A的成员函数调用B的静态方法
2.6 总结:
- 继承体现的是类与类之间的纵向关系(垂直关系),其他的四种体现的是类与类之间的横向关系
- 耦合强弱:依赖 < 关联 < 聚合 < 组合 < 继承
- 从语义:继承(是is的关系),依赖(是use的关系),关联、聚合、组合(是has的关系)
- 代码角度:关联、聚合(指针或引用),组合(子对象),继承(派生列表)
- 当组合和依赖结合时,可以替代继承,组合+依赖(基于对象)vs 继承 + 虚函数(面向对象)
3. 面向对象的设计原则
总结:高内聚,低耦合
面向对象的五大原则:SOLID原则
3.1 单一职责原则
核心思想:一个类或者一个模块,最好只做一件或一类事情,只有一个引起变化的原因
3.2 开闭原则
核心思想:对扩展开放,对修改闭合。核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定
3.3 里氏替换原则
核心思想:派生类必须能替换其基类(类型适应)。派生类可以扩展基类的功能,但不能改变基类原有的功能
表现形式:
- 子类可以实现父类的抽象方法,表现为多态(C中虚函数的体现)
- 子类可以有自己的个性(C子类可以添加自己的新的方法)
- 子类不能覆盖父类的非抽象方法(覆盖在C++中是隐藏的含义)
3.4 接口分离原则
核心思想:使用多个小的专门的接口,而不要使用一个大的总接口
3.5 依赖倒置原则
核心思想:面向接口编程,依赖于抽象(因为抽象是稳定的,具体的是在变化的)
在大多数情况下,开闭原则、里氏代换原则和依赖导致原则会同时出现,开闭原则是目标,里氏代换原则是基础,依赖倒置原则是手段
3.6 最少知识原则
3.7 组合复用原则
核心思想:尽量采用组合、聚合的方式,而不是继承的方式来达到软件复用的目标