長期以來,用 OOP 物件集建模領域概念的目標未獲充分實現。根本問題:現實中同一實體在不同情境下擁有多重身份。如筆者身兼開發者、講師、銀行客戶、校友,不同情境需透過不同介面互動,但本質是同一個體。OOP 若強行建模,要麼建立多個類別,要麼塞進單一類別導致臃腫,難以表達動態身份切換。
Mixin(混入)為普通 Java 類別,實作特定介面,構成 Composite 介面的一部分。Composite 以 Java 介面宣告,用 `@Mixins` 註解指定所需 Mixin,用 `extends` 關鍵字聲明暴露的領域介面。如此在集中位置明確定義 Composite 結構與行為。
橫切關注點保留在獨立實作類別(關注點分離),裝配方式集中在 Java 介面宣告。透過 `extends` 重用父介面宣告,修改父介面自動傳播至子 Composite,避免重複維護。達成雙贏:實作類別單一職責,Composite 開發者全權掌控組合內容。
@Mixins({DeveloperMixin.class, SpeakerMixin.class, AlumniMixin.class})
public interface HumanComposite
extends Developer, Speaker, Alumni, Composite
{}
Qi4j 執行期構造 Composite 實例,將客戶端呼叫路由至特定 Mixin 實例。客戶端視其為普通 Java 物件(但擁有更多介面)。領域介面(如 `Developer`)為普通介面,實作為簡單 Java 類別。身份由 Composite 實例定義而非 Mixin,引用可在系統傳遞並轉型為情境所需介面。新增領域只需擴展 Composite。多重繼承與基礎類別復用問題迎刃而解。

傳統 LMM (Layered Modules Metaphor) 圖表僅停留在紙面,難以強制執行。Qi4j 以代碼顯式建模應用結構,規範開發者行為:


Qi4j 證明 COP 可行:以傳統 OOP 實作 Composite,更好分離關注點,提升代碼品質與復用性。顯式建模應用結構(通常僅在紙面),落實架構執行、消除服務互賴,幫助構建大規模系統,避免被自身「重量」壓垮。COP 與 Qi4j 思想多源自前人實踐與框架精華,將舊有智慧應用於新環境,正是軟體開發與生活的共同哲學。