面嚮對象語言設計中,設計模式可以說是其中的精華了。今天抽出點時間,將設計模式再梳理一下。由於主客觀條件限制,理解可能存在一些誤差,歡迎有不同意見的朋友相互交流探討,共同進步。
設計模式分爲三個大類: 結構型,創建型,行爲型;
一.創建型設計模式
1.理解:
我對創建型設計模式理解是: 對象的生成方式。
2.創建型之 工廠模式:
1).圖解
2).理解:
核心是: 抽象產品,以及 產品獲取規則。
在工廠模式下加入泛型,使得代碼複用性 更高; -> 抽象工廠模式
場景 | 使用前 | 使用後 |
用戶從使用產品B 換成使用產品C |
1.暫停進程; 2.將new B() 改成 new C(); 3.啓動進程; |
1.調用工廠方法,傳入相應的產品參數; |
3.創建型之單例模式:
1).圖解
2).理解:
核心是: 構造方法的私有化; 另要處理 多線程的安全性問題;我覺得單例主要是針對多線程而言;
對象的本質是資源,資源的本質是狀態集。線程的操作單位爲棧,類的定義在常量區,對象的保存地址爲堆;跨線程操作對象需要定義final常量,並且會帶來代碼結構上的高耦合;
當線程A操作了一個類對象時,該對象的狀態已經發生了改變。線程B需要在線程A已經修改的狀態下進行操作,則需要使用單例模式;
4.創建型之原型模式:
1).圖解:
2).理解:
對象的本質是資源,資源的本質是狀態集;
從類生成對象,需要對相應的狀態進行同步;原型模式則相當於直接拷貝源對象生成新對象;
核心實現: 加入一個以自身爲參數的構造函數;
5.創建型之建造器模式:
1).圖解:
2).理解:
核心是對 方法進行修飾,返回本身(指的是 構造器);
使得創建對象的代碼更加優雅,實現鏈式調用的方式;
二.結構型設計模式:
1.理解:
結構型設計模式側重結構,所謂結構,也就是類的結構;
2.結構型設計模式之 代理模式:
1).圖解:
2).理解:
其實很多的代碼都有代理的影子;但是代理模式之所以作爲一個結構型設計模式單獨存在,其核心在於接口。
當然了,這在java裏面屬於靜態代理。動態代理的話,其結構方面的影子倒是少了很多。 從這個意義上來說,動態代理倒不像是結構型設計模式了,因爲其靈活性大大提高。 我想這也是 面向切面編程 的精神所在吧。
3.結構型設計模式之 適配器模式:
1).圖解:
2).理解:
本質上是代理模式的變種;
核心在於,公共接口的部分功能有所變動;(注意,不是新增功能);
4.結構型設計模式之 享元模式:
1).圖解:
2).理解:
我的理解是: 單例+工廠模式;
至於爲什麼給劃分到結構型設計模式,我想側重的是類的水平擴充吧。
5.結構型設計模式之 外觀模式:
1).圖解:
2).理解:
隱隱也能從中感覺出是 代理模式;
我覺得被劃分到 結構型設計模式,主要原因在於 實體類之間的關係過於複雜吧,爲了屏蔽細節。 注意,這個細節是關於類的細節。
6.結構型設計模式之 裝飾器模式:
1).圖解:
2).理解:
還是 代理模式的一類變種, 實際上對子類具有耦合性。 我想適用於類型沒有大的變動的場景吧。
7.結構型設計模式之 橋接模式:
1).圖解:
2).理解:
頂層設計之間的相互依賴。
最終的落腳點在於 具體動作的實現。
3.行爲型設計模式:
1.理解:
所謂行爲型,我認爲就是側重點在於關注 代碼流程吧,完成目標程序所完成的一組行爲。
對於 行爲,我認爲最直接的理解在於: 程序執行代碼的走向。
我們知道,最早的圖靈機模型,就是一條紙帶由進到出,這便是一個行爲了。 如今處於多線程時代,會給這個流程帶來很多的變數,但是流程總體是不變的。
2.行爲型設計模式 之 觀察者模式:
1).圖解:
2).理解:
核心在於 : 觀察者集是動態的。
單線程情況下,實際上是一種優雅的動態插入代碼段方式;
其行爲的邏輯層次是水平的。
多線程情況下,實際上就相當於一個系統了。如應用方面的tomcat,springBoot,乃至操作系統的中斷,都有觀察者模式的影子。
3.行爲型設計模式之 責任鏈模式:
1).圖解:
2).理解:
核心在於子類代理了父類;
其行爲模式爲深度調用。 單線程下也能實現優雅的增加代碼段。
停止條件爲 父類代理爲空。
servlet標準裏的過濾器,本質上也該是這樣的形式,應該是單向的。 但是它給人的形式倒像是棧調用。其原因在於,過濾方法完了之後,會返回過濾結果。線程調用棧 會有一個過濾結果的出棧過程,該過程是一個逆向的過程。 因此,其表現出來是雙向的。
4.行爲型設計模式之 策略模式:
1).圖解:
2).理解:
其核心在於 模板類,模板類提供一些不變的方法,依賴抽象業務類進行實現。
這種結構就用的太多了。 沒想到它竟然是策略模式。 驚訝。
5.行爲型設計模式之 狀態模式:
1).圖解:
2).理解:
我的理解是: 觀察者模式 加入一個回調接口。 每次響應了通知之後,將狀態進行變換。
狀態的變化路徑是已知的。
對比着狀態機去理解。
6.行爲型設計模式之 命令模式:
1).圖解:
2).理解:
接收者相當於 資源,線程句柄;
命令相當於 事件,事件類型;
執行器相當於 虛擬機,cpu;
執行器執行的是命令,命令根據接收者不同而不同。 實際上相當於策略模式了。
7.行爲型設計模式之 訪問者模式:
1).圖解:
2).理解:
實際上就相當於 橋接模式。 不過這裏強調的是 行爲。
剩下的 迭代器模式,解釋器模式,備忘錄模式,中介者模式,模板模式 就不寫了.(模板模式還是比較優雅,接口向子類擴展,如常見的大多數抽象類。)