1.4 像使用自动贩卖机一样使用ADT
假定你站在一台自动贩卖机前,如图1-3所显示,或者更高级的一台,休息一下,然后从贩卖机中买些东西!
当站在自动贩卖机前时,会看到它的界面。投入硬币并且按下按钮,就能购物了。下面是对自动贩卖机的观察结果:
- 你仅能执行机器的界面提供给你的特定任务。
- 你必须理解这些任务——即你必须知道买一瓶汽水应该怎么办。
- 你不能访问机器内部,因为锁着的外壳封装了它。
- 即使你不知道内部将发生什么,但你可以使用机器。
- 如果有人用改进版替换了机器内部的机制但没改变界面,你仍然能用同样的方式使用机器。
与自动贩卖机的用户一样,你就像本章前面见过的ADT包的客户。刚刚说的对自动贩卖机用户的观察,类似于对包的客户的观察: - 客户仅能执行ADT包说明的操作。这些操作常常声明在一个Java接口中。
- 客户必须遵守ADT包提供的操作规范。即客户的程序员必须理解如何使用这些操作。
- 客户不使用ADT操作就不能访问包中的数据。封装原理将数据表示隐藏在ADT的内部。
客户可以使用包,即使程序员不知道数据是如何存储的。 - 如果有人改变了包操作的实现,只要界面没有改变,客户仍然能用同样的方式使用包。
在前一节的示例中,每个包都是实现ADT包的类的一个实例。即,每个包是一个对象,它的行为是ADT包的操作。你可以把每个这样的对象看作我们刚描述的自动贩卖机。每个对象封装了包的数据和操作,就像自动贩卖机封装了它的产品(汽水)和输送系统一样。
有些ADT操作有输入,类似于你投入自动贩卖机中的硬币。有些ADT操作有输出,类似于自动贩卖机提供的找零、汽水、消息及提示灯。
现在假定你是自动贩卖机面板或界面的设计人员。机器能做什么?在使用机器时人应该做什么?考虑在机器内如何保存及输送汽水瓶,对你是否有帮助?我们强调,你应该忽略这些方面,而把注意力完全集中于人如何使用机器上——即你要关注界面的设计。忽略无关细节能使你的任务更简单,并提高设计质量。
我们记得,作为设计原则,抽象要求你关注于什么而不是如何。当你设计一个ADT并最终设计一个类时,使用数据抽象将关注焦点集中在你想对数据做什么,而不必担心如何完成这些任务。本章开头,当设计ADT包时我们练习了数据抽象。当我们选择包应该有的方法时,我们没有考虑如何表示包。相反我们集中考虑每个方法应该做什么。
最后,我们编写详细说明该方法的Java接口。然后编写一个使用包的客户程序,但仍然不知道它的实现。如果有人为我们编写了实现,我们的程序大概能正确执行。如果其他人给我们一个更好的实现版本,我们不需要修改已经编写的客户程序仍能继续使用。客户的这个特征是抽象的主要优势。
时间: 2024-09-16 20:58:02