1、概念:策略模式定義了算法族,並將算法族封裝起來,算法可以相互替換,算法的變動不會影響請求該算法的客戶。
2、使用場景:
1)在不同類需要不同行爲,或者不同類需要相同行爲但行爲表現(內容)不同時,可以使用strategy模式。需注意,在設計繼承時需考慮是否使用策略模式,
尤其繼承中有動態行爲時。
2)根據不同的情況使用不同的策略,或者策略在未來還可能用其他方式實現。
3)對客戶隱藏具體策略算法的實現細節。
3、補充:封裝動態、多用組合少用繼承、面向接口編程而不是面向對象編程。
二、觀察者模式
1、概念:觀察者模式定義了一系列對象之間的一對多關係,當一個對象狀態發生變化時,將會通知依賴它的多個對象。
2、使用場景:
1)“推”或“拉”信息
2)觸發其他對象方法
3)解耦存在關係的多個對象
3、補充:爲實現有關係對象之間的鬆耦合而努力。
繼承無法實現最有彈性和最好維護的設計,利用組合和委託可以實現在運行時具有集成行爲的效果。利用繼承設計子類的行爲,是在編譯時靜態決定的,而且所有子類都會繼承到相同的行爲。利用組合的做法擴展對象的行爲,可以在運行時動態的進行擴展。
三、裝飾者模式
1、概念:動態的給一個對象添加一些額外的職責。
2、使用場景:
1)爲某個現有對象動態增加一些功能或職責。
2)當某個對象的職責經常發生變化或經常需要動態的增加職責。
3、補充:類應該對擴展開放,對修改關閉。如果一段方法已經調試好,修改好bug。新的要求再去修改,則會導致產生新的問題。對擴展開放,可以在不修改代碼的情況下就可以搭配新的行爲,設計具有彈性,可以應對改變,可以接受新的功能來應對的需求。觀察者模式可以在不修改代碼的情況下擴展新的功能。開放-關閉原則應用在設計中最容易改變的地方。每個地方都採用開放-關閉原則是一種浪費,增加代碼複雜度。
四、工廠方法模式
1、概念:工廠方法定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到了子類。
2、使用場景:
1)類不知道自己要創建的是哪一個對象。
2)類用子類創建對象。
3)將對象的創建和使用分離
3、補充:抽象倒置原則,要依賴抽象,不要依賴具體類。
五、抽象工廠模式
1、概念:提供了一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。
2、使用場景:
1)有關聯的對象需要一起應用並且它們的關係是強迫的。
2)系統需要由多個關聯的對象來組成。
3、補充:工廠方法模式隱藏在抽象工廠模式中。
六、單例模式
1、概念:確保一個類只有一個實例,並且提供一個全局訪問點。
七、命令模式
1、概念:將“請求”封裝成對象。使用不同的請求、隊列或日誌來參數化其他對象。命令模式也可支持撤銷操作。
2、使用場景:
1)命令模式與多個對象之間存在調用關係,封裝調用方法即封裝請求,隱藏具體實現,將命令者與執行者完全解耦
2)請求隊列
3)實現日誌和事務系統
3、補充:使用“聰明”命令對象,直接實現了請求,而不是將請求委託給接收者。但是調用者和接收者之間的解耦程度差,不能把接收者當作參數傳遞給命令。
八、適配器模式
1、概念:將一個接口,轉換爲客戶所期望的接口,讓原本不兼容的類合作無間。
2、使用場景:
九、外觀模式
1、概念:定義了一個統一的接口,用來訪問子系統中的一羣接口,簡化了子系統。
2、使用場景:
1)一個功能訪問需要調用多個對象
2)客戶端程序與多個子系統之間有很大的依賴性
3、補充:最少知識原則:只和你的密友交談,減少對象之間的交互,只留幾個‘密友’)。外觀模式使得使用與子系統解耦。
十、模板模式
1、概念:在一個方法中定義了一個算法的骨架,並將一些步驟推遲到子類中。
2、使用場景:
1)不改變算法結構,重新定義算法中某些步驟
3、補充:好萊塢原則(不要調用(打電話給)我們,等我們調用(打電話給)你),減少對象之間的依賴腐敗。