1、爲什麼使用?設計模式,可以使代碼更簡潔、更優美、更效率、擴展性型更強。
2、設計模式的原則:開閉原則(對拓展開放,對修改關閉)(抽象化是關鍵)
--單一職責原則:類的職責應該單一(不存在多種原因導致類的變更),否則類應該被拆分。
--里氏替換原則:任何基類可以出現的地方,子類一定可以出現。(LSP)(該規範中子類儘可能不要重寫或重載基類的方法)(面向對象設計的基本原則之一)(開閉原則的補充)(抽象化的具體實現)
--依賴反轉原則:依賴於抽象,不依賴於具體。(編程是需要依賴具體的類時,不與該類交互,而轉向與該類的上層接口交互)(面向接口)(開閉原則的基礎)
--接口隔離原則:每個接口,對於實現該接口的類,不存在冗餘的方法,否則需拆分接口。(使用多個隔離接口,要優於一個集合接口)
--最少知道原則:類對於自己依賴的類知道的越少越好。(迪米特法則)(無論依賴的類的邏輯多麼複雜,子類只需要通過邏輯被封裝的暴露的方法去使用即可)(該原則保證依賴的類改變是,對繼承他的類影響最小)(只與直接朋友通信)(朋友關係:類之間存在耦合[依賴,關聯,聚合,組合])(直接朋友:作爲成員變量,方法參數,方法返回值的類)(陌生類不要出現在局部變量中)
--合成複用原則:合成/聚合優於繼承。
3、模式應用場景
----結構模式
--適配器模式(Adapter):已有接口和定義接口不匹配。(類的適配器模式和對象的適配器模式)
實現描述:
類適配(原始類A有一方法funcA,接口faceA需要實現funcA、funcB,實現一個適配類B繼承與A實現接口faceA)(解決接口內方法個數和原始類方法不匹配)
對象適配(將類適配中A和B的關係從繼承,改變爲B持有A的實例對象)(解決原始類方法和已有接口方法的命名不匹配和個數不匹配)
接口適配(樁問題)
對於接口,引申出兩個概念:標識接口(沒有聲明任何方法的接口)和樁(實現了接口,但是實現方法體爲空的類)。
標識接口:用來標識某個類符合一定的規範。(對於有人制定規則的前提下,這種標識非常有用,如何不遵守這種規範,任意去實現自己的代碼,將會給程序帶來致命的錯誤)
樁:在一個接口裏聲明的一組方法,有的時候某些方法可能被忽略執行,或者返回值沒有任何意義,可以定義一個樁,讓具體的實現延遲到具體的子類。(沒理解透)
--裝飾模式(Decorator):擴展一個類功能。(動態的添加功能)
實現描述:原始類A定義有方法funcA,定義接口faceA有方法funcA,定義裝飾類B持有A的實例對象、實現接口faceA。(旨在對原始類的擴展)
--代理模式(Proxy):代替原對象進行一系列操作。(對象的訪問控制)(隱藏一個對象的具體信息)
實現描述:原始類A定義有方法funcA,定義接口faceA有方法funcA,定義裝飾類B持有A的實例對象、實現接口faceA,客戶程序通過接口faceA去調用A的funcA。(旨在封裝原始類的複雜接口)
--外觀模式(Facade):各組件類解耦,形成一個外觀提供服務。(計算機類和各個組件類,爲了防止各個組件之間的耦合,用計算機類持有各個組件的實例,避免了組件之間的關聯)
實現描述:原始類A、B、C,定義外觀類D持有A、B、C的實例對象。(旨在對A、B、C關係的解耦)
--橋接模式(Bridge):抽象化和實例化的解耦。
實現描述:定義接口faceA含funcA,定義橋接類A持有接口faceA的一個對象並實現funcA,funcA會根據一定的邏輯調用faceA的funcA,使實現接口faceA的各個類具體的邏輯實現和 接口的調用邏輯分離,客戶程序調用A的方法funcA就可以調用相應的處理邏輯。
--組合模式(Composite):客戶程序和複雜元素的內部結構解耦。(樹節點和樹)(部分整體模式)(像操作簡單元素一樣操作複雜元素)
實現描述:將複雜的組織結構以樹的形式實現,簡化對複雜數據結構的操作(汗)(沒理解透)
--享元模式(Flyweight):已存在對象的共享。(共享池)(連接池)(沒理解透)
實現描述:管理類持有實例對象的列表並管理這個列表,對外以工廠的模式提供對象。
-------簡單工廠模式(擴)
--簡單創建:一個工廠類負責對實現的同一接口的一些類進行實例的創建。(傳遞相關類型名字符串來區分創建的類)
--個性化創建:在簡單的基礎上,工廠類對每個類實現一個創建方法。(個性化)(多個方法)
--靜態個性化創建:在個性化創建的基礎上,工廠類的方法設置爲類的靜態方法(static)。(多個靜態方法)
----創建模式
--工廠方法模式(Factory Method):解決簡單工廠模式在擴展的時候必須修改工廠類、違背開閉原則。(簡單工廠模式類的創建依賴於工廠類)(擴展性好)(支持新增產品)
實現描述:定義一個工廠類接口,對每一個產品類創建一個工廠類。
--抽象工廠模式(Abstract Factory):對產品簇的擴展支持(不支持新增產品,可新增產品簇)
實現模式:定義一個工廠類接口,多個產品抽象接口。(產品簇)
--單例模式(Singleton):提供唯一對象(創建對象過多時)(減壓)(對象只能唯一)
實現模式:內部類生成private static 對象,通過public static方法對外提供(內部類實現)
--建造者模式(Builder):創建一個複雜對象,使創建流程和發雜對象各部分的具體創建過程分離。
實現模式:定義一個建造者接口Builder,一個導演類Director持有建造者Builder接口,通過該接口調用具體建造者ConcreteBuilder類中的方法,從而構造出複雜的Product對象。
--原型模式(Prototype):對象的克隆。(本地方法,比new更效率)(簡化對象的創建)(淺拷貝:數組、引用對象)(深拷貝:原始類型和包裝類型、String)(越過類的構造函數權限進行克隆)(與單例模式衝突)
實現模式:重寫Object類的clone方法。(Cloneable接口,數組、引用對象需要單獨實現克隆)
----關係模式
-父類與子類
--策略模式(Strategy):讓可互換算法的具體變化不影響到調用的客戶端程序。(決定權在客戶端程序)(由客戶決定具體調用的算法)(客戶程序不需要知道算法的具體變化和所需要的數據)
實現模式:一個抽象的算法接口,一個可有可無的提供輔助函數的抽象類,一羣實現接口、繼承抽象類的算法類,一個需要相關算法的客戶端程序。
--模板方法模式(Template Method):算法公用部分放到父類,不同部分延遲到子類實現。(父類引用調子類方法)(沒理解透)
實現模式:一個提供主方法的抽象類,一羣繼承抽象類的算法類,一個需要通過抽象類的引用調用具體方法的客戶端程序。
-類之間
--觀察者模式(Observer):兩類接口存在依賴。(一方影響另一方)(一方監控另一方)
實現模式:一接口A依賴於另一個接口B,接口A的實現的變化影響B的實現(一個抽象類和他的子類),接口B的實現需要去監控A的動態並做出反應。
--迭代器模式(Iterator):聚合的遍歷。
實現模式:聚合接口和迭代器接口,迭代器接口的實現持有聚合接口的引用,從而操作集體的聚合類型。
--責任鏈模式(Chain Of Responsibility):多個對象互相引用。(對用戶程序隱藏具體調用的對象)
實現模式:一個類B繼承於抽象類A、實現了接口funA,A持有funA的引用、可以去引用B的實例對象,客戶程序通過B的實例對象調用相應操作。
--命令模式(Command):命令者和受令者的解耦。
實現模式:命令接口F,實現接口的命令類C,C持有最終完成命令的類R的引用,調用類I持有命令接口的引用。
-類的狀態
--備忘錄模式(Memento):備份對象狀態,以便恢復。
實現模式:一個原始類A可以創建備忘錄類B,存儲類C持有B的實例用來存儲備忘錄。
--狀態模式(State):狀態不同,行爲不同。
實現模式:原始類A持有狀態類B的實例,A根據B的屬性值去調用B的相應的具體方法。
-BY中間類
--訪問者模式(Visitor):解決和元素類關係不大且頻繁變動的操作的改變問題(來訪問我吧)(擴展性:接收不同的訪問者,操作的擴展)(符合單一職責)(外界調用元素接口引用)
實現模式:一個元素接口,一個訪問者接口,元素接口接收訪問者接口從而讓其進行一些相關操作。
--中介者模式(Mediator):工作有關的工作者類之間的解耦。
實現模式:一箇中介者接口,實現接口的中介者類,該類持有N個工作者類對象,並協調他們進行工作,抽象工作者類持有與之對應的中介者接口引用。(外界調用中介者接口引用)
--解釋器模式(Interpreter):解釋相關表達式。(擴展性好)(影響效率、性能,維護性複雜)(不建議輕易使用)(單一問題頻度很大,可以考慮)
實現模式:表達式接口(非終結符表達式類和終結符表達式類),一個上下文環境Context類。(沒理解透)