从对象创建和引用小议解耦2011-08-14 IBM 徐海弘简介:解耦是软件设计领域中一个永恒不变的话题,在软件设计过程中,为了最大程度降低各个应用 组件之间的耦合性,以提高其可维护性和可复用性,出现了诸多设计原则和解决方案。例如面向接口编程 ,开 - 闭原则,依赖倒转原则等,另外更出现一系列设计模式。同时,由于如何实现解耦涉及面相当广 ,大至组件的划分和关联,小至对象的创建和引用,往往使软件开发人员感到迷惑。本文将从对象创建和 引用的角度出发,介绍常见的一些解决方案,并比较之间的差别,期望读者能从一个侧面加深对解耦概念 的理解。应用场景为方便后续介绍,本文假设一个计算器的应用。初始设计由以下几部分组成:计算器界面类 CalculatorUI该类接受用户输入的表达式,执行一些输入校验工作,并将合法的表达式 传递到具体的分析器,最终将计算结果返回给用户。语法分析器接口,ExpressionEvaluator及其实现类 ExpressionEvaluatorImpl,其承担实际的计算工 作。在该应用场景中,CalculatorUI类需要持有指向 ExpressionEvaluator实现的引用,以便在运行时委 派其实际的计算工作。文章后续将围绕如何持有和初始化 ExpressionEvaluator实现展开介绍,并依次提 出多种解决方案。清单 1. 计算器实现方式一 (new 操作符 )public class CalculatorUI {
private ExpressionEvaluator expressionEvaluator;
public CalculatorUI() {
expressionEvaluator = new ExpressionEvaluatorImpl();
}
public String evaluate(String expression) {
if (expression == null || expression.isEmpty()) {
throw new IllegalArgumentException("[" + expression + "]
is not a valid expression");
}
return expressionEvaluator.evaluate(expression);
}
}