面向对象设计:原理、模式与实践
1. 设计原则
在进行系统设计时,应精准地对系统需要执行的任务进行建模,而非尝试对未来可能有用的对象或动作建模。这样设计会自然地趋向于具有适当抽象级别的方案。不过,这并不意味着我们无需考虑未来可能的设计修改,设计应具有开放性,以满足未来的需求。在抽象接口时,要确保只对真正需要的内容进行建模,避免过度设计。
设计接口时,可将自己置于对象的立场,假定对象十分注重隐私。除非认为对其他对象公开数据符合自身最大利益,否则不要让它们访问这些数据。同样,除非确定希望其他对象能够强制自己执行特定任务,否则不要为它们提供相应的接口。
2. 组合
到目前为止,我们学会了将系统设计为一组相互交互的对象,每次交互都涉及在适当的抽象级别上看待对象。但我们还不知道如何创建这些抽象级别。有多种方法可以实现这一点,不过大多数设计模式都依赖于两个基本的面向对象原则:组合和继承。由于组合相对简单,我们先从它开始介绍。
组合是将多个对象组合在一起以创建一个新对象的过程。当一个对象是另一个对象的一部分时,组合通常是一个不错的选择。以汽车为例,汽车由发动机、变速器、起动机、前照灯和挡风玻璃等众多部件组成,而发动机又由活塞、曲轴和气门等组成。在这个例子中,组合是提供抽象级别的有效方式。汽车对象可以为驾驶员提供所需的接口,同时也能让机械师访问其组件,从而提供更深入的抽象级别。如果机械师需要更多信息来诊断问题或调整发动机,这些组件还可以进一步细分。
然而,这个常见的组合示例在设计计算机系统时并非十分有用。物理对象很容易分解为组件对象,自古希腊人最初假设原子是物质的最小单位以来,人们就一直在这样做。计算机系统通常比物理对象简单,但识别