从对象创建和引用小议解耦
2010-07-12 00:00:00 来源:WEB开发网清单 4. 计算器实现方式四 ( 注册表组件 )
public class CalculatorUI {
private ExpressionEvaluator expressionEvaluator;
public CalculatorUI() {
expressionEvaluator = (ExpressionEvaluator)
GlobalRegistry.getService("SimpleExpressionEvaluator");
}
public String evaluate(String expression) {
if (expression == null || expression.isEmpty()) {
throw new IllegalArgumentException("[" + expression
+ "] is not a valid expression");
}
return expressionEvaluator.evaluate(expression);
}
}
在 清单 4 中,CalculatorUI 不再关注通过何种方式创建 ExpressionEvaluator 实现实例,相对于前者前通过工厂模式创建实例,现在则从全局注册表中获取。通过引入 GlobalRegistry 之后,CalculatorUI 和 ExpressionEvaluator 实现类之间达到了更大程度上的解耦,两者完全通过注册表实现了相互关联。在 Java 相关的诸多技术中,常常可以看到此实现方式的身影。例如 JavaEE 的目录服务也是类似的实现方式,联想到在应用程序中,我们通过标准的 JNDI 接口去访问后台的目录服务,从而获取 EJB,Web Service 等等的引用。同样,在 OSGI 中,各个 Bundle 通过 BundleContext注册和获取相关服务,其目的之一也是降低 Bundle 之间的耦合性。
继续观察上述实现方式,无论是通过工厂模式,抑或是通过注册表组件,始终在 CalculatorUI 中包含如何获取 ExpressionEvaluator实现实例的逻辑,那么有无方法彻底将其从客户端代码中移除呢?答案之一便是对象注入技术。当前常见的实现策略是通过构造函数或者 JavaBean 的标准 setXXX 方法进行对象实例的注入。两种方式各有优缺点,一般认为使用后者会更具备灵活性。这里,将借助于 Spring 这个优秀的开源项目,展示第五种解决方案。
更多精彩
赞助商链接