Posted on 2009-03-10 17:30
love1563 阅读(955)
评论(0) 编辑 收藏 所属分类:
设计模式
首先,如果没有接口会怎么样呢?一个类总归可以从另一类继承,难道还不够么?
没接口会怎么样
一个对象需要知道其他的一些对象,并且与其他的对象发生相互作用,这是因为这些对象需要借助于其他对象的行为以便完成一项工作。这些关于其他对象的知识,以及对其他对象行为的调用,都是使用硬代码(Hardcode)写在类里面的,可插入性几乎为零。
如果要加入一个新的类,仅仅意味着加入新的硬代码,而不能给出动态的可插入行。
那么基于类的继承是否可以提供一点帮助呢?比如现在有一个具体类,提供某种使用硬代码写在类的行为。现在,要提供一些类似的行为,并且实现动态的可插入,也就是说,要能够动态地决定使用那种实现。一个可能的做法就是为这个类提供一个抽象超类,生命出子类要提供的行为,然后让这个具体类继承自这个抽象超类。同时,为这个抽象超类提供另一个具体子类,这个子类以不同的方法实现了超类所生命的行为。客户端可以动态决定那个具体子类。这是否可以提供可插入性呢?
答案是,这却是可以在简单的情况下提供可插入性。但是由于java语言是一个单继承的语言,换言之,一个类只能有一个超类,因此,在很多情况下,这个具体类可能已经有了以超类,这时候,要给它加上一个新的超类是不可能的,如果硬要加的话,就只好把这个新的超类加到已有的超类上面,形成超超类的情况;如果这个超超类的位置已经被占用了,就只好继续向上移动,直到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性设计,就变成了对整个等级结构中所有的类的修改。
这还是假设这些超类都是在设计师控制之下的。如果这些超类是一些软件商提供的,设计师无法修改,怎么办呢?如果有一个具体类,它有一个超类是Frame,那么新加入的超类就只好一直向上移动到java.lang.Object类上面,这怎么可能呢?
因此,没有接口可插入性就没有保证。
接口是对可插入性的保证
接口使可插入性变得可能。
在一个类等级结构中的任何一类可以实现一个接口,这个接口会影响到此类的所有子类,但是不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类则可以从此类自动继承到这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法。
这时候,这些子类就具有了可插入性。
关联的可插入性
正如前面所说的,一个对象需要完成一项任务,所以需要知道其他的对象,并且调用其他对象的方法。这个对象对其他对象的知识叫做关联(Association)。
如果一个关联不是针对一个具体类的,而是针对一个接口的,那么任何实现这个接口的类就都可以满足要求。换言之,当前对象并不在意所关联的是哪一个具体类。而仅仅关心这个类是否实现了某一个借口。
这样一来,就可以动态地将这个关联从一个具体类转换到另一个具体类,而这样做的唯一条件是它们都实现某个接口。
调用的可插入性
同样,一个对象不可避免地需要调用其他对象的方法。这种调用不一定飞的是某一个具体类,而可以是一个接口。这样一来,任何实现了这个接口的具体类都可以被当前对象调用;而当前对象到底调用的是哪一个具体的实例则完全可以动态地决定。
因此,接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口的重要性就越大。接口使得软件系统在灵活性和可扩展性、可插入性方面得到保证。