关于接口、抽象类以及委派的理解

  • Post author:
  • Post category:其他

在这次做的实验中需要完全独立地去设计程框架,其中就涉及到怎样安排接口、抽象类还有刚学到地委派机制的使用。关于接口的使用,在上次实验中题目给出的框架提供了一定程度上的参考,但具体的作用、意义还有和其他二者的区别还是模糊不清,因此在这里对这些概念略微做一下简单的整理。

关于接口和抽象类

Java作为典型的OOP编程语言,Java接口(interface)和Java抽象类(abstract class)是Java语言中典型的抽象类型,可以说,Java程序的可复用性、可维护性以及可拓展性正式通过这些抽象方式实现的。而其中,Java接口和Java抽象类二者在这一意义上来讲既有很大的相似性又有明显的区别。因此,为理清二者的概念,这里将二者放到一起进行说明。

首先,Java接口和Java抽象类的典型特征都是对抽象方法的使用,但接口只能包含抽象方法,而抽象类则可以提供某些方法的实现。因此,当我们需要加入新的方法时,抽象类显然更具优势:我们只需要在抽象类中添加该方法即可,而其子类无需再次进行修改即可直接使用新的方法;而接口中一旦添加了新的方法,其对应实现这个接口的类都需要增加相应的具体实现方法,否则会无法通过编译。(注:JDK 1.8 以后,接口里可以有静态方法和方法体,而且接口允许包含具体实现的方法,该方法称为”默认方法”,默认方法使用 default 关键字修饰。JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去)。

其次,抽象类的实现只能由其子类实现,也就是说实现抽象类的类只能单继承这个抽象类;但一个类却可以同时继承多个接口,即任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型。

总之,我们可以看到抽象类就相当于一个模板,模板中有子类可以公用的部分,也有需要子类自行实现的部分,是为模板式设计,它同时具有多态性+复用性;而接口是对行为的抽象,它只定义一组行为规范,每个实现类都要实现所有规范,叫辐射式设计,它只有多态性;

由此,根据以上特性,人们总结出了一种典型的设计模式:使用接口对设计进行声明,随后再用抽象类实现这个接口,其中需要拓展的方法使用抽象方法实现,最后再用具体类完成这些抽象方法的实现。这个模式就是“缺省适配模式”。在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。(A extends AbstractB implements interfaceC,那么A即可以选择实现(@Override)接口interfaceC中的方法,也可以选择不实现;A即可以选择实现(@Override)抽象类AbstractB中的方法,也可以选择不实现)。

关于Java中的委派模式

相比于接口与抽象类,委派模式并不是具体的抽象类型,而是一种对接口、抽象类等抽象类型的综合使用方法。委派可以理解为将一个任务的执行过程进行多层分解:首先使用接口定义完成任务的方法,随后在多个具体类中给出该方法针对不同情况的多个的实现,最后再定义一个委派用的类,负责根据不同的情况选择调用不同的具体类实现该方法执行任务。

具体例子可以参考https://www.jianshu.com/p/bf78285fc3d3

可以看到,通过任务委派能够将一个大型的任务细化,然后通过统一管理这些子任务的完成情况实现任务的跟进,能够加快任务执行的效率。然而,任务委派方式需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。

因此,对于一个比较复杂的任务,我们可以对其进行分解,分发执行并通过一个委派者角色将最终结果返回,以此规范程序代码的结构和逻辑。


版权声明:本文为qq1793987019原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。