目录
- 什么是面向对象
- 面向过程
- 面向对象
- 面向函数
- 面向对象的三大基本特征
- 封装
- 继承
- 多态
- 面向对象的六大原则
- 单一职责原则(Single Responsibility Principle)
- 接口隔离原则
- 里氏替换原则
- 开闭原则
- 依赖倒置原则
- 迪米特法则
什么是面向对象
我觉得面向对象这个问题我们可以从思维和代码两个角度来说。
从思维的角度来说,对象是我们生活中所能看到的一切,对象具有两个典型的特征:
1.它具有自己的属性
2.它具有自己的行为模式
比如经常被举得例子,汽车可以在马路上跑。这时候汽车对于我们来说他就是一个对象。它拥有座椅,轮子,发动机等等属性,同时这些属性相护配合,使汽车这个整体可以实现载人,移动这些功能也就是行为模式。也许你会觉得疑惑,那座椅是不是一个对象呢?它当然也是。对象本身就是一个抽象的概念,我想可以这么理解,世间万物都是对象,比如最小的原子,它也是一个对象,它是由电子和原子核组成。也就是电子和原子核这两个属性,因为不同的行为模式,和自身属性创建了不同的原子对象。
从思维角度说完之后回归我们的代码层面
如果想在代码层面了解面向对象,我觉得有必要了解一下面向对象产生的原因。具体的可以参考[#https://www.cnblogs.com/Dr-wei/p/11861849.html]这篇博文,我觉得它写的很完美了。如果你对软件发展的两次危机有了了解。那我想这里就很容解释了。其实归根就是因为代码庞大,无法管理和二次维护,产生了大面积的冗余代码。
说完代码上产生的原因,咱们再回归到代码本身相信很多人刚入行都听说过java是面向对象的语言,c是面向过程的语言。我认为这种说法是有失偏颇的,也很容易把新人代入一个错误的理解,觉得面向对象是一种对语言的描述。其实面向对象的重点是上面提到的思维。相比较而言,我们可以说java能更容易的完成面向对象的实现。因为C语言中的结构体,你敢说不能用它来搞一个对象吗?
面向过程
面向过程这个东西,很多人觉得它太老旧了。我并不觉得,因为在面向对象中,仍然存在着面向过程的代码,比如你要实现某个对象中的某个方法。这个方法中的代码就是面向过程。面向过程应该是我们解数学题最常用的方式,先从第一个函数通过计算得到一个值,然后传给第二个函数。在一个函数的处理中最后得到了最终的结果。这就是面向过程。
面向对象
面向对象这个东西上面说了一大堆,总之,他就是我们眼中看到一切东西。我们的世界正是因为对象之间的各种动作(方法)关联才得以运作。
面向函数
上面提到了面向过程和对象,顺便提一下面向函数编程。其实我觉的面向函数编程更加像面向过程编程。只不过整个过程被我们分割成了很多份。而每一份都是可以复用。这样就可以极大的减轻我们的开发量。比如,拿东西这个动作。这个动作不仅人类可以完成,机器人也可以完成。但是在面向对象里,人类和机器人是两个完全不同的类。但是他们拥有相同的方法。这个方法是可以复用的,这时候函数的优秀就显示出来了。我们只需要在人和机器人的对象中预留出一个函数的位置。在使用前把这个拿东西动作附上去就可以,这样我们就少了很多代码。
小结
其实我觉得面向过程,面向对象,和面向函数这三类编程方式之间并无优略之分。在实际的开发和使用过程中,我们应该根据具体情况选择不同的思维方式。面向对象的产生其本质就是为了解决复杂的问题。而对于一些简单的问题如果我们要创建很多对象反而将问题给复杂化了。所以在简单问题时,我们直接使用面向过程想法更加方便。而面向函数,我觉得是在我们面向对象的开发中,时刻保持着一颗偷懒的心,想着那一部分方法在之后还会用到,将这部分代码提炼出来单独保存为函数即可。(感觉类似于可以传递的工具类)
面向对象的三大基本特征
封装
所谓封装就是将代码中不为认知的部分给藏起来。我们拿人来举例子。我们的心脏在时刻跳动着,但是对于外界的各个物体来说,它的跳动与否似乎都不会带来影响。但是对于人这个对象来说那就不一样了,只要心脏停止跳动,人就game over了。所以,我们就可以将心脏作为一个private进行保存就可以了。
继承
继承,这个就更好理解了。我们都拥有父亲,和母亲。我们在父母身上继承了他们的一些特征,比如容貌,血型。但是我们又拥有和他们不同的一些技能。这就是继承。(这个比方感觉并不合理,因为我们的父母拥有一些我们不曾拥有的技能,也就是我们没有继承来的,这样就违法了接下来要说的面向对象五大原则里的里氏替换原则了)
多态
多态,我的理解就是多种姿态。比如车这个类,继承它的子类实现了移动的能力,但是对于不同的车它的实现移动方式又不相同(汽车和自行车那肯定实现移动方式不一样)。但是这不要紧,对于一个想要车加快移动的人来说,他和我要车,我给你一个车。至于汽车还是自行车,你到手了才能知道,反正我就告诉你我有车就行了。你看要车的人想要增加移动速度的目的是不是达成了(就是自行车的有点扯)
面向对象的六大原则
面向对象的六大原则,这是铁律。如果想写面向对象的代码,或者在程序的设计时想使用面向对象的思维,在设计对象时就必须考虑这六大原则。再以后我们学习的设计模式就是出自这六大原则(但是这并不是我们炫技的资本,只有十分必要的情况下,再考虑使用五大原则诞生的设计模式)。因为这六大原则过于深奥,《设计模式之禅》用了五十多页来介绍。所以这里简单带过一下,具体的在之后补上
单一职责原则(Single Responsibility Principle)
每一个类应该专注于做一件事情
接口隔离原则
超类存在的地方,子类是可以替换的。
里氏替换原则
实现尽量依赖抽象,不依赖具体实现。
开闭原则
应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
依赖倒置原则
实现尽量依赖抽象,不依赖具体实现。
迪米特法则
又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。