往期精彩:
- Modern C++ 学习笔记——易用性改进篇
- Modern C++ 学习笔记 —— 右值、移动篇
- Modern C++ 学习笔记 —— 智能指针篇
- Modern C++ 学习笔记 —— lambda表达式篇
- Modern C++ 学习笔记 —— C++面向对象编程
- Modern C++ 学习笔记 —— C++函数式编程
Modern C++ 学习笔记——C++中的面向对象编程
关键字:面向对象、设计模式、面向接口、IoC
文章目录
面向对象编程(OOP)
在谈起C++函数式编程复兴之前,先聊一下大家更熟悉的“面向对象编程”(Object-oriented programming,OOP)这个编程范式。
学习过C++之后一定都知道面向对象的三大特性:封装、继承、多态,正是C++提供了如此强大的特性,让C++程序员更熟悉面向对象命令式的编程。面向对象编程是中具有对象概念的编程范式,同时也是一种程序开发的抽象方针。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。
面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。
说起面向对象无论如何都绕不过GoF的著作《设计模式:可复用面向对象软件的基础》,在书中最开始的部分就对面向对象的核心做出了总结,这也是书中23种经典设计模式的核心理念:
- 面向接口编程,而不是面向实现编程
- 使用值不需要知道数据类型、结构、算法细节。
- 使用者不需要知道实现细节,只需要知道提供的接口。
- 利用抽象、封装、动态绑定、多态。
- 符合面向对象的特质和理念。
- 优先使用对象组合,而不是类继承
- 继承需要给子类暴露一些父类的设计和实现细节。
- 父类实现的改变会造成子类也需要改变。
- 我们以为继承主要是为了代码重用,但实际上在子类中需要重新实现很多父类的方法。
- 继承更多的应该是为了多态。
示例一:桥接模式
假设有如下描述:
- 家具:木头桌子、木头椅子、塑料桌子、塑料桌子
- 属性:燃点、密度、价格、重量
我们如下所展示的一样设计类:
- 有“材质类”Material,具有属性燃点和密度
- 有“家具类”Furniture,具有属性价格和体积
- 在 Furniture 中耦合了 Material。而具体的 Material 是 Wood 还是 Plastic,这在构造对象的时候注入到 Furniture 里就好了。