
上QQ阅读APP看书,第一时间看更新
1.8.4 接口/实现范式的模型
我们再拿Square类来举例。假设你正在编写一个计算整数平方值的类。你必须提供接口和实现,也就是说必须定义一种方式使用户能调用并获取平方值,也要实现计算平方值。然而,用户不应该知道任何详细的实现。图1.13展示了一种实现方式。注意在该类图中,加号(+)表示公共访问修饰符,而减号(-)表示私有访问修饰符。即你可以通过给方法指定加号签名的方式来定义接口。

图1.13 平方类
该类图对应的代码如下:

注意该类中用户唯一能访问的元素就是公共方法getSquare。该公共方法就是接口。求平方值算法的实现在私有方法calculateSquare中。请注意属性squareValue是私有的,因为用户无须知道该属性的存在。因此对象隐藏了一部分实现,只暴露了用户需要与之交互的接口。与使用该对象无关的细节对其他对象则是隐藏的。
如果要修改实现,比如你想使用语言内置的平方值函数,你不需要修改接口。下面代码使用了Java库的方法Math.pow,其提供了同样的功能,但接口依然是calculateSquare:

用户使用相同的接口会得到相同的功能,但具体实现却变了。如果你编写处理数据的代码时可以利用这一点。例如,你可以把数据存储从文件转移到数据库中,而不必强制用户改变任何程序代码。