编程模式--再论java接口

   如果可以动态的将一个构件移走,并以另一个构件取代之,那么这种构件就是可插入构件。接口是实现构件的可插入性的关键。

一、什么是接口

       一个java接口是一些方法特征的集合,这些方法特征当然来自于具体方法,但是他们一般都是来自于一些在系统中不断出现的方法。一个接口只有方法的特征,而没有方法的实现,这些方法在不同的地方被实现,可以具有完全不同的行为。

      在人们讲到“接口”的时候,这个词往往有两种不同的含义:第一种是指java接口,这是一种java语言中存在的结构,有特定的语法和结构;另一种仅仅是指一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做java接口,后者就叫做接口。

     在java中一个方法的特征仅包括方法的名字、参量的数目和种类,而不包括方法的返回值类型、参量的名字以及所抛出的异常。在java编译器检查方法的重载(Overload)时,会根据这些条件判断两个方法是否是重载方法。但是在java编译器检查方法的置换(Override)是,则会进一步检查两个方法的返回类型和抛出的异常是否相等。

    一个java接口的方法只能是抽象的和公开的,java接口不能有构造函数,并且接口可以有public、静态的和final的属性;接口中还可以定义一些常量。

    接口和类的最重要区别是,接口仅仅描述方法的特征,而不给出方法的实现;而类不仅给出方法的特征,而且给出方法的实现。因此,接口把方法的特征和方法的实现分隔开来。这种分隔,体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色可以由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求有任何其他的共同之处。

二、为什么要用接口

      一个对象需要知道其他一些对象,并与其他的对象发生相互作用,这是由于这些对象需要借助其他对象以便实现一项功能。如果对象在引用其他对象的时候,直接引用的是其他具体的对象,那么在以后的升级修改过程中,这些引用具体的对象可替代性几乎为零,也就是可插入性几乎为零。

     那么基于基类的继承是否可以提供一些帮助呢?我们在使用过程中通过抽象超类声明(声明出子类要提供的行为),然后有不同的子类继承自这个超类并以不同的方式实现了这个超类所声明的行为。客户端可以动态的决定使用哪个具体子类,这是否可以提供可插入行呢?

    这确实可以在简单的情况下提供可插入性。但是由于java是单继承的。因此,在很多情况下,这个具体类可能已经有了一个超类,这时候,再给他加上一个新的超类是不可能的。如果非要实现的话,就只能把这个新的超类添加到已有的超类上面,形成超类的超类。这样一来,对于一个具体类的可插入性设计,很容易形成这个等级结构中的所有类的修改。更糟糕的是,如果上面的超类不能进行修改,这样我们的整个设想就无法实现了。

     通过上面的讨论,我们就能清楚的看到,没有接口,可插入性就没有保证。

     在一个类等级结构中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但是不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类则可以从此类自动继承到这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法。这时候,这些子类就具有了可插入性。

     ① 关联的可插入性

     正如前面所说的,一个对象需要完成一项任务,就需要知道其他的对象,并且调用其他对象的方法。这个对象对其他对象的知识叫做关联。

     如果一个关联不是针对一个具体类的,而是针对一个接口的,那么任何实现这个接口的类都可以满足要求。换言之,当前对象并不在意所关联的是哪一个具体类,而仅仅关心这个类是否实现了某个接口。这样一来,就可以动态的将这个关联从一个具体类转到另一个具体类,而这样做的唯一条件是他们都实现了某个接口。

     ②调用的可插入性

     同样,一个对象不可避免的需要调用其他对象的方法。这种调用不一定非得是某一个具体类,而可以是一个接口。这样一来,任何实现了这个接口的具体类都可以被当前对象调用;而当前对象到底调用的是哪一个具体类的实例则完全可以动态的决定。

     因此,接口提供了关联以及方法调用上的可插入性。软件系统的规模越大,生命周期越长,接口的重要性就越大。接口使得软件系统在灵活性和可扩展性、可插入性方面得到保证。

三、工程中的应用

    设计师应当使用java接口和抽象java类将软件单位的内部和外部耦合起来。换言之,应当使用java接口和抽象类而不是具体类进行变量的声明、参数的类型声明,以及数据类型的转换等。当然,一个更好的做法是仅仅使用java接口,而不是使用抽象java类来做到上面这些。

 

 

本文通过总结《java与模式》而来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值