耦合表示类及其对象与其它类及其之间的相互联系。耦合强度可以通过类中对象之间传送的信息的数量和复杂程度来度量。
在面向对象设计中,主要存在两种耦合,交互耦合和继承耦合。
1)交互耦合
交互耦合是指类之间的联系是通过消息关联实现的,这种耦合应尽量减少。一般说来,消息关联中参数不要多于三个,否则就应考虑简化,当然,这种限定也不是绝对的。另外,在降低单个消息关联的复杂性的同时,也应该简化所发送的消息的数目及类所接收的消息的数目。例如,图5.15中类ABC就是与许多其它类高耦合的,这种情况应避免出现。
图5.15 类之间的高耦合
图5.16则是一个有争议的有关消息传递的耦合现象。类A仅仅将从P所接收到的消息直接发送给Q,其中消息中不附带任何消息也不直接响应。类A显然没有必要耦合P或Q,任何P或Q或消息的格式或内容的变化几乎都将影响到A。这种耦合无论有什么理由被设计出来,都 应尽量避免。
图5.16 消息传递引起的耦合
2)继承耦合
继承耦合是指类及其对象之间的联系是通过继承关系实现的。继承作为抽象类和具体类之间耦合的一种形式,在面向对象设计中是十分需要的,因此这种耦合应尽量提高。
为了获得这种高耦合,各个具体类应该的确是它的抽象类的一个具体类。因此,如果某个类明确排斥了其具体类中的许多属性,则它并不是与其具体类高耦合,如图5.17(a)所示。
比较复杂的情况如图5.17(b)所示,其中类继承了许多来自其抽象类的属性,但并不使用 这些属性。对于这两种情况,设计人员应该寻找另一种分类结构,其中各个具体类继承并使用(因而更加高度耦合到)其抽象类的属性和行为。
图5.17 耦合性不高的继承耦合