当你开发一个面向对象程序或理解其设计时,一个上佳的方法是将对象想象成“服务提供者”。你的程序本身也是为用户提供服务的,它通过使用其他对象提供的服务来做到这一点。所以,你的任务是创建(更好的情况是,从已有的库中找到)一些提供对应服务以解决问题的对象。

    可以先从一个问题开始:“如果我能从魔术帽里变出一些对象,究竟什么对象才能解决我的问题呢?”比如,你要创建一个记账系统,于是你可能会需要一些预设的输入页面对象、负责计算的对象,以及连接各种打印机以打印支票和发票的对象。其中有些对象也许已经存在,那么其他不存在的对象应该是什么样的呢?它们应该提供哪些服务,同时它们还需要哪些其他对象的支持呢?如果继续深入的话,到了最后,你要么会说“编写这个对象的代码应该很简单”,要么会说“我确信这个对象早已存在”。这种将问题拆解为一系列对象的方法确实行之有效。

    把对象视为服务提供商还有一个额外的好处,即提升了对象的聚合程度。说到这里,就需要提到软件设计领域中一个体现基础品质的术语——“高内聚性”(high cohesion),这指的是设计的组件(比如对象、方法或者对象库等)无论从哪个方面看都整合得很好。人们在设计对象时很容易犯的一个错误就是为对象添加太多的功能。例如,在一个打印支票的程序里,你一开始可能会认为需要一个既能排版又能打印的对象。然后,你发现这些功能对于一个对象而言太多了,其实你需要3个或者更多对象来负责这些功能。比如,一个对象包含了所有可能的打印布局,通过查找它可以知道如何打印一张支票。另一个或一组对象则作为通用打印接口,负责连接所有不同型号的打印机(但不负责记账,也许你需要购买该功能而非自行创建)。还有一个对象负责整合前两个对象提供的服务以完成打印任务。因此,每一个对象都提供了一种配套服务。在面向对象领域,出色的设计往往意味着一个对象只做好一件事,绝不贪多。这条原则不只适用于那些从外部购买的对象(比如打印接口对象),也适用于那些可复用的对象(比如支票排版对象)。

    把对象视为服务提供商,不仅对你设计对象的过程有所帮助,也有利于他人阅读你的代码或复用这些对象。换句话说,如果别人因为对象提供的服务而认识到它的价值,那么他就会更加轻松地在自己的设计中使用这个对象。