面向对象的小结
看了些关于设计模式和阐述面向对象的书,感觉对
java
语言的认识提高了不少,从
java
的语法、算法的实现等等提高到设计这一层面上。
从一开始学习面向对象语言
java
的时候就知道,面向对象最重要的三个特征就是:继承,封装,多态。当时认识的时候仅仅是在
java
语法层次上,知道该怎么写代码,继承,封装,多态是怎么通过代码实现的。但是在开发的时候不知道该怎么去用,怎么去用才能体现出面向对象的好处。通常情况下我们往往就去写一些实现细节的具体类,干嘛要去写那些抽象类、接口等等,那有什么好处吗?我想写程序时间不长的程序员都会有和我一样的想法。
下面就是我在学习设计模式的时候,总结了那些高人对面向对象的看法。
封装
:什么是封装?简单的看来就是在类里面写一些方法,属性。方法中有许多算法。在实例中调用这些这些方法,实现商业逻辑。这仅仅是从代码的角度来看,从设计思想上来说,封装的意思就是将自己(类)的内部数据和其他实现的细节隐藏起来,彻底的将提供给外界的
API
和实现的细节隔离开来。封装的好坏,
也是一个系统的好坏的重要标志。
正因为有了封装,保证了信息的隐藏,促进了软件的复用(因为每个模块都不依赖于其他模块而存在的,因此每个模块都可以独立的在其他的地方使用)。在这里,提到了复用,那什么又是复用呢?一种是代码的复用,比如事先写好了许多算法,如排序、比较等等,需要的时候就调用一下。这种复用在面向过程和面向对象的编程中都会用到。另一种复用,是面向对象中独有的,那就是数据的抽象化和继承关系使的概念和定义可以复用(例如实现了同一个接口的各种类都有相同的方法名)。多态性使得实现和应用可以复用(例如继承或者实现了同一个接口的各个类的实例可以指向接口或者抽象类声明的变量)。而抽象化和封装可以保持系统可维护性和可扩展性。所以面向对象复用得焦点不再集中在函数和算法等具体细节上,而集中在最重要的含有商业逻辑的抽象层次上。(《
java
与设计模式》)。
抽象层次在
java
语法中实际上就使接口和抽象类,这就涉及到我们在编程的时候什么时候用到接口或者抽象类的问题了。简单的说通过对抽象层的实现或者继承,利用多态性,使系统的复用性提高。这样使的你从面向对象的理念去看待继承和多态性,而不是从
java
语法的层面上去看。抽象层应该是战略性的,较为稳定的。因为大部分实现类,都会继承或者实现这些抽象层次。所以抽象层次要尽可能的周全,想到系统的扩展。
继承
:学习
java
语言的时候都知道继承是怎么回事,通常的理解也就是代码的复用,继承了基类,很多方法不用重复写了,方便了很多。但是真正在设计和开发阶段,很少是从一个实现类中去继承,可以想象如果基类中的方法修改了,我们不知道他的子类在系统中有哪些地方去调用了该基类的方法,会发生什么样的情况,这些都是我们不可预见的。所以,继承一般都是继承(实现)接口,或者抽象类。在《
java
与设计模式》作者提到继承应当被看做是封装变化的方法,而不应当被认为是从一般到生成特殊的对象的方法。同一种可变性的不同表象意味着一个继承等级中的具体子类。
比如马,白马,黑马。白马、黑马是同一个等级的。他们继承了抽象的马,可变性就是颜色。因为白马黑马实际上并不是特殊的马。注意:只要可能尽量使用‘合成’,而不要使用继承来达到复用的目的。
抽象类与接口的不同主要体现在:一个类同时只能继承一个基类,而一个实现类同时可以实现多个接口。将有些常规的通用的方法写在抽象类中,供子类调用,增加了代码的复用率,这也是很有必要的。
不要去继承与自己毫无相关的类。
多态性主要体现在重载(
overload
),重写
/
置换(
override
),虽然
override
(分处基类和子类)
是
java
多态性的表现之一,但是继承通常不用来置换的。
重载(在一个类中)会根据方法特征来判断这两个方法是否重载,
置换(分处基类和子类)出了检查两个方法的方法特征还要进一步检查返回类型和抛出异常是否相同。
在程序设计的时候需要注意一些原则:
1.
只要可能尽量使用‘合成’,而不要使用继承来达到复用的目的
2.
继承的结构等级不应太多,一种可变性不应当与另一种可变性混在一起。
3.
为客户端提供尽可能小的单独接口,而不是大的总的接口。
4.
多次条件转移的商业逻辑封装到不同的具体子类中,从而使多态性代替条件转移。
5.
虽然
override
(分处基类和子类)
是
java
多态性的表现之一,但是继承通常不用来置换的。
6.
要针对接口编程,不要针对实现编程。
7.
接口使对可插入性的保证。一个关联不要针对具体类而要针对接口。
8.
应当使用
java
接口和抽象
java
类来声明,而不使用具体类来进行类的变量声明,参量的类型声明,方法的返回类型的声明。
9.
理想情况下,一个
java
类只实现
java
接口和抽象类中声明过的方法,而不应当给出多余的方法。