23種基本設計模式-概述
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):讓可互換算法的詳細變化不影響到調用的client程序。(決定權在client程序)(由客戶決定詳細調用的算法)(客戶程序不須要知道算法的詳細變化和所須要的數據)
實現模式:一個抽象的算法接口,一個可有可無的提供輔助函數的抽象類。一群實現接口、繼承抽象類的算法類,一個須要相關算法的client程序。
--模板方法模式(Template Method):算法公用部分放到父類,不同部分延遲到子類實現。(父類引用調子類方法)(沒理解透)
實現模式:一個提供主方法的抽象類。一群繼承抽象類的算法類,一個須要通過抽象類的引用調用詳細方法的client程序。
-類之間
--觀察者模式(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類。(沒理解透)
23種基本設計模式-概述