WEB开发网
开发学院软件开发Java 从对象创建和引用小议解耦 阅读

从对象创建和引用小议解耦

 2010-07-12 00:00:00 来源:WEB开发网   
核心提示: 清单 4. 计算器实现方式四 ( 注册表组件 )publicclassCalculatorUI{privateExpressionEvaluatorexpressionEvaluator;publicCalculatorUI(){expressionEvaluator=(ExpressionEv

清单 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 这个优秀的开源项目,展示第五种解决方案。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:对象 创建 引用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接