1. 从面向过程到面向对象
早期计算机编程是基于面向过程的(如C语言),通过设计一个算法就可以解决当时的问题。随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。面对复杂的业务关系,不断变化的业务流程,面向过程的设计与现实已经难以应付这些问题。
面向对象的思想,就是一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,将现实世界中的关系抽象成类、继承,实现对现实世界的抽象与建模。
面向对象相比面向过程的优势:
- 结构清晰:面向对象的编程中,对象被赋予属性和方法,更接近现实世界事物,更容易理解和维护。
- 封装性: 面向对象良好的封装性优势表现为其对内部的修改,对外界产生影响较小。
- 易拓展性: 面向对象编程,代码更好的被重用,更容易进行拓展,可以更好的应对业务的变化。
面向对象相比面向过程的劣势:
- 增加的工作量: 如果一味地强调封装,当修改对象内部时,对象的任何属性都不允许外部直接存取,则要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。
- 性能低: 由于面向对象更高的逻辑抽象,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小的都开销很大。
面向对象的优点:
- 代码开发模块化,更易维护和修改。
- 代码复用性。
- 增强代码的可靠性和灵活性。
- 增加代码的可理解性。
2. 面向对象的四个特性
-
抽象
抽象描述了一个对象的基本特征,可以将这个对象与所有其他类型的对象区分开来,因此提供了清晰定义的概念边界。抽象关注一个对象的外部视图,用来分离对象的基本行为和实现。我们可以理解为抽象关注接口,即可观察到的行为;而封装则关注这些行为的实现。
抽象的两个原则:
- 最少承诺原则:对象的接口只提供它的基本行为。
- 最少惊奇原则:抽象捕捉了某个对象的全部行为,不多也不少,并且不提供抽象之外的惊奇效果和副作用。
评判抽象的品质:
耦合:模块之间的关联强度应该是比较弱的,即低耦合。
内聚:模块内的各个元素的联系时紧密的,即高内聚。
充分性:类或模块应该记录某个抽象足够多的特征,从而允许有意义的、有效的交互。
完整性:类和模块的接口记录了它的全部特征。
基础性:只有访问该抽象的底层表现形式才能够有效的实现那些操作。
封装
封装给对象提供了隐藏内部属性和行为的能力,对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法。使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用、修改对象内部的私有信息,在一定程度上保证了系统安全性。
封装优点:
通过隐藏对象的属性来保护对象内部的状态。
提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。
禁止对象之间的不良交互提高模块化。
继承
就像现实中,孩子会继承父母的一些特征,面向对象使用继承机制实现代码的复用,多个类所公用的代码部分可以只在一个类中提供,而其他类只需要继承即可。继承给对象提供了从基类获取字段和方法的能力,继承提供了代码的重用性,也可以在不修改类的情况下给现存的类添加新特性。多态
多态指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
实现多态,有二种方式,覆盖,重载。
覆盖: 指子类重新定义父类的虚函数的做法。
- 重载: 指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
抽象和封装的不同点
抽象和封装是互补的概念:一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。
3. 面向对象五大设计原则
单一职责原则(SRP)
一个类应该仅有一个引起它变化的原因,这意味着一个类应该只做一件事情。开放封闭原则(OCP)
对象或实体应该对扩展开放,对修改封闭。里氏替换原则(LSP)
子类可以替换父类并且出现在父类能够出现的任何地方。依赖倒置原则(DIP)
实体必须依靠抽象而不是具体实现。它表示高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象。接口隔离原则(ISP)
不应强迫客户端实现一个它用不上的接口,所以,使用多个专门的接口比使用单个接口要好的多。
参考引用:
1. http://blog.csdn.net/luoxinwu123/article/details/8446094
2. http://www.cnblogs.com/ysyn/p/3380856.html
3. http://www.importnew.com/10980.html
4. http://blog.jobbole.com/86267/