为什么我们说接口比继承好,很重要的一个原因就是接口更加灵活,组件的依赖性更弱,同样的,目前另一种做法则是采用一些标记性的语言来实现比接口更大的灵活度。例如基于xml的配置文件,以及J2SE1.5中将要引入的属性。
组件的测试
组件和容器的依赖脱离为组件测试提供了一个很好的环境。我们在测试一节中讨论过容器内测试往往是比较麻烦的,其原因就是在于上面所说的组件污染问题。例如在spring框架中,组件是一个标准的JavaBean,你可以直接编写代码来设置组件的属性和定义组件之间的依赖关系(适用于自动化测试),也可以把这项工作交给spring容器(适用于开发和部署)。
组件测试在测试的分类中属于集成测试。
理解服务
在讨论组件时我们谈论了组件粒度的问题。当组件的粒度不仅仅限于单个对象的时候。在构成组件的多个对象中,有些对象处于组件内部,不和其它的组件交互,有些对象需要和外部组件进行交互。后一种对象起的就是服务的作用。在设计模式中,这种设计被称为Fa?ade模式。而在OO语言中,他们相当于接口的概念。不管如何比喻,服务订立了组件和组件之间的契约。这种契约是稳定的(如果业务需求是稳定的),不会随着组件内部的变化而发生变化。
要理解这一点也非常的容易。对于一个提供用户认证的组件,一个可能的服务对用户进行认证和授权,至于组件内部采用LDAP还是关系数据库来存放用户信息,对服务来说没有任何的差别。
这样做的好处有很多,一是组件之间能够以一种稳定的方式存在,组件内部的变化不至于扩散到整个软件系统。二是软件设计将会转向重点设计组件之间的服务,而组件的实现细节将会隐藏起来,这不但有助于设计者更好的把握软件的全局架构,而且有助于分工的细化。
服务并不是什么新颖的概念,RPC、IDL都是类似的技术。但我们谈的服务侧重架构和理念,不涉及到具体的技术,这一点同SOA和WebService的关系类似-SOA是一个结构性的概念,而WebService是实现SOA的一种适合的技术。 Stairway to Heaven - Service Oriented Architectures(http://www.enterpriseintegrationpatterns.com/docs/stairwaytoheaven.pdf)一文讨论了SOA需要注意的问题,并提出了实现SOA的三个阶段,本文所讨论的服务为文中所讨论的阶段3,也是最理想的阶段。
服务最好实现为接口。原则上服务可以是任何一种技术:JMS、WebService、RPC、或是简单方法调用。但是出于服务的稳定性的考虑,我们不应该将一个服务和具体的技术绑定起来,这样会使的服务发生变化的可能性增大。在Java语言中,接口是具有极大的灵活性的,因此,将接口实现为普通的Java接口是较好的选择。不过,这样做的话,我们也许就不能够使用远程调用,Web服务之类的功能了,不过这并不要紧,以下就是原因。
服务适配器
客户端可以直接使用接口,也可以通过适当的适配器来将普通的接口服务转换为特定技术实现的服务。
如上图所示,一个普通的接口通过适配器模式转换成和特定技术相关的服务。在JMX技术中,也采用这种方式,JMX平台能够将一个普通的服务端口通过适配器进行转换,以适用于各种的协议,例如http、sock、snmp等等。
文章来源于领测软件测试网 https://www.ltesting.net/