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):讓可互換算法的具體變化不影響到調用的客戶端程序。(決定權在客戶端程序)(由客戶決定具體調用的算法)(客戶程序不需要知道算法的具體變化和所需要的數據)

實現模式:一個抽象的算法接口,一個可有可無的提供輔助函數的抽象類,一羣實現接口、繼承抽象類的算法類,一個需要相關算法的客戶端程序。

--模板方法模式(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類。(沒理解透)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了19 篇原創文章 · 獲贊 3 · 訪問量 9797
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章