模式11:Default Implementation

 由  yiqpku 发布

模式描述

为模块提供一个缺省实现。


具体描述

为了最大化可复用性,模块必须足够灵活使得它在不同的操作环境下都能很好地工作。但是为了使模块适于使用,它必须是可独立部署的。考虑到这点,可以为模块提供一个具备良定义扩展点的缺省实现,使得模块在必要时能够被扩展。这是使用性和复用性之间的一种平衡。
下图展示了缺省实现。Default.jar模块包含了DefaultImpl类,它是DefaultInterface的缺省实现。Default.jar模块包含了相应的配置来使用这个缺省实现。Betterimpl.jar也使用default.jar模块,但是自己提供了对DefaultInterface的实现以及对default.jar模块的配置。


图片来自:http://www.kirkk.com/modularity/


实现变种

有时缺省实现放在模块内,有时是放在另一个模块内,这个时候需要参考Separate Abstractions模式。除了模块的行为(即缺省实现)外,我们还必须处理模块配置。理想情况下,模块是可以被外部配置的,这样就能在不同上下文环境中被使用了。当定义模块的缺省实现时,也需要同时提供模块的缺省配置。
提供外部配置以及缺省实现,模块就容易融合到设计该模块时考虑的上下文环境中,这样有助于提高模块的可用性。如果上下文环境与原先设计的不同,开发者可以为新的上下文环境创建一个新的模块实现并提供相应的配置,这样有助于提高可复用性。
例如,在上图中,default.xml文件被放在default.jar中,允许default.jar模块即使没有client.jar也能在缺省的操作环境中使用。另外一种选择是把default.xml放在client.jar模块。在这种情况下需要我们适当地配置模块。也就是说如果没有client.jar,模块就不能被使用,除非我们提供了另一个配置。
缺省实现通常需要抽象,并把抽象的实现混合在一起,所以将模块中的实例串在一起是有必要的。可以使用工厂类或者类似Spring的框架来处理这个问题(见Implementation Factory


结果

大多数模块都有缺省实现。如果没有提供任何缺省实现,则模块本质上是一个规范,需要我们在使用时自己提供实现。这在某些情况下是有用的,特别是在使用Separate Abstractions时。
缺省实现是开发插件程序的一种方法。模块包含的缺省实现拥有的扩展点是可嵌入的。在上图中,可以把可选择的行为嵌入到default.jar模块中,并基于新的实现配置模块。换句话说,缺省实现是模块中接口的实现。假如这是一个抽象模块,没有其他任何模块依赖它的实现类,我们可以提供抽象的新实现,其可以在运行时嵌入到模块中。
在创建一个缺省实现时无法同时提供行为和配置,则需要在系统的完整性上进行妥协。通过实现必要的接口来创建拓展点是相对容易的,但是找到配置模块的方法也是很重要的。


总结

缺省实现有助于平衡复用性和可用性。由于提供了缺省实现模块很容易被使用,同时很容易在新的环境中以新的实现对模块进行扩展。除了通过实现接口为模块提供新的行为之外,还需要认真考虑模块的配置。

查看评论