继承、组合与Spring IoC
1、继承
继承是面向对象技术的三大特性之一,其他两个是多态和封装。众所周知,这三个特性都是基于面向对象技术里面最基本、最核心的载体——类。类的出现是为了解决计算机和现实世界描述问题的差异性,这点类似于ORM是解决关系型数据库和面向对象技术的对数据描述的差异性一样。所以原则上类的设计应该始终符合一个最本质的出发点,它应该是对现实世界实体的一个准确描述,包括属性的定义和操作的定义,并且这些属性的操作的划分应该是符合逻辑思维的,符合现实世界的思考方式。类封装了数据和操作,并提供一定的接口给外部进行访问和调用来完成特定的功能。
继承描述了若干类之间的一种级联关系,子类可以继承地访问父类中对子类开放的属性和方法,并且可以覆盖(Overr
ide)父类的方法以表现出与父类有所差异的行为——动态多态。在java中,继承只有单根继承,也就是说一个类只能有一个直接父类,通过
extends关键字指明其父类,这也是符合现实世界的思维方式的,呵呵。而在C++中,是支持多继承地,一个类可以继承多个父类,这让一个类的功能大大增加,我在这里只是功能,我觉得这种多继承的模式是有缺点的,一个类既是A,又是B会导致思维方式上的紊乱。java中实现一个类的多功能的方式是通过实现多个接口(Interface),与类不同,接口定义了一项特定的功能或者说技能,在jdk中,我们可以看到一些诸如Serializable,Appendable的接口,而类是一个实体,那么我么可以以这样的一种方式来理解,一个子类只能是一个父类的子类,它本身的属性和功能一定程度上依赖于父类,但它可以通过某些方式扩展自己,1、定义属于自己的属性和操作 2、它可以自己去实现某些特定的功能,但这些功能不是自己创造的,而是通过学习的方式来获得的,这可以通过实现若干个接口来获得“额外的技能”。这就好像一个人要经历出生和成长一样,出生的时候他就有了一些自己的属性,他本身的属性是通过继承父母而得到的,这就是extends。而后通过后天学习来获得额外的功能,这就是implements。Java中定义一个类的时候是extends在前,implements在后,他对应了先出生后学习的思维模式,我不知道java设计者是否是考虑到了这一点,只是我自己的理解,呵呵。
2、组合、组合和继承的比较
前面我们说了,类是描述实体的,接口是描述功能的。那么是不是一个类只能通过实现很多的接口来扩展功能呢?答案显然是否定的。前面也提到了,一个类扩展有两种方式,实现接口一种,另外的就是定义自己的属性。从这个“属性”里,我们可以做些文章。类的属性称之为域,我们可以把另一个类作为现有类的一个域,这就是所说的组合,也称为复合。一个类通过将其他类作为自己的私有成员来完成某些复杂的功能,这种方式可以理解为一个类对另一个类的永久雇佣,当然也可以把接口作为私有成员,那就是一个类对一项功能的永久雇佣了,而且通常情况下,这是一种应该推崇的设计方式,即面向接口编程,这里暂且不论。接下来我们将接口和类模糊化,在谈论组合中,我们约定将作为私有成员的类也包括接口。
组合和继承都实现了代码重用,那么他们有什么区别呢?设计模式中强调了组合优于继承的设计理念。继承的一个缺点是增加了系统修改的负担,修改意味着改变继承关系,因为一个类存在于他所在的继承树中,这样的结构对类有很大的约束作用,使的它不易变化,牵一发而动全身。而组合不一样,组合是一种可以独立变化的结构,类功能的调用是通过委派的方式,并不是类自己本身的功能,继承结构中一项操作或者行为是类本身的,组合中是通过调用成员类来完成的。这种类职责的划分无疑更加地有利于系统的维护,更加有利于代码的重用。
3、Spring IoC给创建对象带来便利
组合的方式降低了系统修改时需要付出的维护陈本,提高了系统的健壮性。但组合也带来了构造对象的复杂性,怎样处理创建对象时对象间的依赖关系。如果一个类中有很多的组合对象,很多的类成员域,那么在构建对象的时候,我们必须依次先创建出这些成员类,然后以这些类作为参数去构建最终我们需要的类,这无疑增加了编程时的复杂度。
Spring IoC可以让我们从创建复杂依赖对象的复杂中解脱出来。Ioc是控制反转的意思,Inversion of Con
trol,Spring通过一个IoC容器来实现控制反转。简单地说,所谓的控制反转就是把本来需要自己构建复杂依赖关系的对象的任务交给IoC容器来做,减少了编程人员的负担。单从对象创建角度来看,它是一个创建对象的工厂,它提供给用户获取所有对象统一的接口,用户不用自己一步步创建所有依赖对象,而只要通过一个对象的标识符字符串便可以获得需要的对象。但你必须事先告诉你所要的对象是一个怎样的对象,它的所有成员域,当然也包括类成员域,你需要在一个xml配置文件中配置你的对象的依赖关系,并给每个对象一个唯一的标识符。也就是说你把创建对象的任务交给了Spring IoC容器,你所需要做的就是告诉容器我需要对象,容器自动把相应的对象创建好返回给你。
当然Spring Ioc的功能不止局限于创建对象这么简单,它同时还管理着这些对象的生命周期和其他一些复杂的特性,在这里不再陈述。
(以上内容为自己个人理解,有所不妥之处欢迎提出,我会及时更改错误,若内容没有深度,望莫鄙视才好。。。)