圖解設計模式

  面嚮對象語言設計中,設計模式可以說是其中的精華了。今天抽出點時間,將設計模式再梳理一下。由於主客觀條件限制,理解可能存在一些誤差,歡迎有不同意見的朋友相互交流探討,共同進步。

  設計模式分爲三個大類: 結構型,創建型,行爲型;

一.創建型設計模式

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).理解:

       實際上就相當於 橋接模式。  不過這裏強調的是 行爲。 


  剩下的 迭代器模式,解釋器模式,備忘錄模式,中介者模式,模板模式 就不寫了.(模板模式還是比較優雅,接口向子類擴展,如常見的大多數抽象類。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章