當階層太寬——某個父型別有過多直系子型別——意味著缺少中介抽象,這就是 Wide Hierarchy。
核心定義#
經驗法則:父型別擁有超過 9 個直系子型別就算過寬。
伴隨的問題:
- 客戶端只能直接依賴具體子型別 → 變更性差。
- 因為缺乏中介抽象,共通性無法被合理抽出 → 容易連動 Unfactored Hierarchy。
Wide Hierarchy 與 Unfactored Hierarchy 雖都違反「應用有意義的泛化」,差別在於:
- Wide Hierarchy:直系子型別過多 → 缺中介抽象。
- Unfactored Hierarchy:階層中有重複未被抽出。 兩者經常同時出現。
常見成因#
- 忽略泛化:每加一個子型別都直接掛到根上,不檢查中介抽象是否合理。
- 缺乏重構:階層初期合宜,後期未隨需求成長重新整理。
範例#
java.util.EventObject#

Figure 6.18: EventObject 的部分階層
java.util.EventObject 有 36 個直系子類別,是典型的 Wide Hierarchy。檢視這些子類別會發現:
PrintEvent自己還有三個子類(PrintJobAttributeEvent等)。- 但
TreeExpansionEvent、TreeModelEvent、TreeSelectionEvent卻直接掛在EventObject下。
這代表抽象層級不一致——程式員必須在「高層抽象」與「低層具體類別」之間做認知跳躍。
建議重構#
套用 extract superclass:找出概念上同類的子型別,抽出中介父類別。

Figure 6.19: 透過引入中介型別重構 Wide Hierarchy
對 EventObject 來說,可引入 TreeEvent 中介類別:
flowchart TD
A[EventObject] --> B[PrintEvent]
A --> C[AWTEvent]
A --> D[CaretEvent]
A --> E[TreeEvent]
E --> F[TreeExpansionEvent]
E --> G[TreeModelEvent]
E --> H[TreeSelectionEvent]
Figure 6.20: 為 EventObject 階層建議的重構
軼事:裝置監控專案的 Device 類別#
一個網路裝置監控產品早期的
Device類別合宜,但隨著FireAlarmDevice、CameraDevice等不斷加入,子類別越來越多——既出現 Wide Hierarchy,也出現 Unfactored Hierarchy。 後來引入VideoDevice、AlarmDevice、SensorDevice等中介類別,重複大幅減少、直系子類數同步下降——一次重構解決兩個壞味道。
對品質屬性的衝擊#
- 理解性:抽象層級不一致,要做認知跳躍。
- 可變更性:客戶端被迫依賴低層抽象,後者較易變動。
- 可擴充性:缺中介抽象 → 缺擴充點。
- 可重用性:中介抽象本是良好的對外介面。
別名#
- Wide inheritance hierarchy:直系子類別超過 4 個。
- Missing levels of abstraction:缺少抽象層級(根附近需更多展開)。
- Coarse hierarchies:成員集中在少數類別,未分散到中介祖先。
- Getting away from abstraction:子類別新增的操作太多,暗示中介類別缺失。
實務考量#
語言/函式庫強制繼承某型別#
java.util.ListResourceBundle在 JDK 中有 443 個直系子類別——這是因為函式庫架構強制要求繼承此型別來提供本地化資源。這種情況下的 Wide Hierarchy 是可接受的。
介面用作協定規範#
介面(如
Serializable、Comparable)用來規範通用協定時,直系實作數可以非常多——這也不是壞味道。