- 將不變性抽象化。
- 不同模式可以互相組合搭配。
創建型模式
-
- 著重於物件的創建。
-
- 產品可以由不同工廠所生產,將工廠抽象化。
-
- 將創造一複雜物件的流程抽象化,並確保流程上每一步驟均被執行。客戶端透過 director,director 再透過 builder 創建物件。
-
- 構建並傳回物件的函式。
-
- 具有 clone 函式的物件,可用來複製出多個相同物件。
-
- 私有化建構子。提供一個取得實體的接口,並由該接口判斷是否需要產生新的實體。
結構型模式
-
- 著重於類別間的關係。
-
- 轉接器負責匹配兩者之間的介面。
-
- 利用 CARP (合成/聚合複用原則) 解耦類別之間的關係。
-
- 整體與部分可以被一致對待。
-
- 動態為物件加上屬性,而非直接修改物件加上屬性。
-
- 由單一類別負責操作多個類別的組合調用,類似於基金操作。
-
- 共用物件,並將變因抽出成外部變數。
-
- 提供和被代理人相同的介面,並內含被代理人實體。客戶端只和代理接觸,代理再將需求轉發給被代理人執行。
行為型模式
-
- 著重於類別之間的溝通。
-
- 串接回調函式,使其有機會處理同一事件。
-
- 將類別方法抽象成命令類。
-
- 設計小型程式語言。每一個表達式皆有一個 interpret 接口,用以解釋 (執行) 自身。
-
- 類別提供迭代接口,以便在集合內被存取。
-
- 仲介者類別知道系統中的所有類別,系統中的類別只知道仲介者類別。類別溝通時,均透過仲介者類別轉發訊息。
-
- 類別提供保存/回復其內部狀態的接口。
-
- 當一類別狀態改變,如何通知所有相依類別的方式。
- observer 註冊回調函式至 subject,當 subject 狀態更新,調用已註冊的回調函式。
-
- 當狀態轉換過多時,將狀態抽象成類別,並在類別之內負責狀態轉換。
-
- 提煉不同演算法的相同介面。透過一個上下文類別 (context) 保存演算法實體。客戶端只和該上下文類別接觸,上下文類別再調用演算法實體運行演算法。
-
- 將演算法共同部分抽象化,將其細節部分延遲至子類別實現。
-
- 如果欲訪問的元素類別固定,可以將欲訪問的內容抽象化成訪問者類別。
物件導向設計原則
-
- 簡化類別的工作。
-
- 多擴展,少修改。當遇到需求改動時,建立抽象以便隔離將來可能的改動,改以擴展應付需求。
-
- 針對接口 (interface) 而非底層實現 (implementation) 撰寫程式。
-
- 父類別必須可以用子類別加以抽換,而不影響程式運行。
-
- 透過第三方負責兩個類別之間的溝通,盡可能對類別解耦。
-
- 可以在運行時,根據字串選擇要實體化何種類別。