方塊人
結合jdk原始碼看設計模式——組合模式
前言:相信大家都開啟過層級很多很多的資料夾。如果把第乙個資料夾看作是樹的根節點的話,下面的子資料夾就可以看作乙個子節點。不過最終我們尋找的還是資料夾中的檔案,檔案可以看做是葉子節點。下面我們介紹一種模式,與這種樹級結構息息相關。當然,今天的主角是hashmap。接下來我們一起來看hashmap中到底是怎麼跟樹級結構進行掛鉤的。
一、定義
將物件組合成樹形結構以表示「部分-整體」的乙個層次結構,使客戶端對單個物件和組合物件保持一致的方式處理。
二、適用場景
1、客戶端可以忽略組合物件與單個物件的差異
注意組合模式中的概念,當客戶端使用組合模式的時候是對單個物件和組合物件保持一致的方式處理,而不是不同的方式處理。所以如果客戶端可以忽略組合物件和單個物件的差異時,才用組合模式。
2、處理乙個樹形結構
這裡就很好理解了,組合模式就是處理樹形結構的
三、結合hashmap看組合模式
1、抽象構件:總的抽象類或者介面,定義一些通用的方法,比如新增、刪除。
2、中間構件:繼承或者實現抽象構件,定義儲存方式,並針對特殊需要重寫抽象構件的方法。
3、葉子節點:繼承或者實現抽象構件,並針對特殊需要重寫抽象構件的方法。
葉子節點需要實現或者繼承抽象構件,如果有需要也可以新增到中間構件上。就比如說我現在進入d盤,d盤就是乙個抽象構件,無論在d盤**,我都可以執行新建,刪除操作。中間構件就相當於資料夾,裡面定義了相應的儲存方式,加入的檔案是葉子節點,並且會按照這種方式來儲存,同時這個中間構件也可以選擇再加入乙個其他中間構件或者自己。葉子節點就可以看作檔案。注意,在組合模式下所有類都需要直接或者間接,繼承或實現總的抽象構件。下面講hashmap中的putall()方法
複製**
public class hashmapextends abstractmap
implements map, cloneable, serializable
final void putmapentries(map<? extends k, ? extends v> m, boolean evict)
else if (s > threshold)
resize(www.yunshengyule178.com);
for (map.entry<? extends k, ? extends v> e : m.entryset()) }}
}複製**
上面是簡化的hashmap。我們看見putall方法傳入的是map物件,map就是乙個抽象構件(同時這個構件中只支援鍵值對的儲存格式),而hashmap是乙個中間構件,hashmap中的node節點就是葉子節點。說到中間構件就會有規定的儲存方式。hashmap中的儲存方式是乙個靜態內部類的陣列node tab。下面是簡化的具體**
複製**
public class hashmapextends abstractmap
implements map, cloneable, serializable }
複製**
輸出結果為:
上面實現將hashtable中的鍵值對放入hashmap中。如果放在組合模式下,你就可以看作是將hashtable這個中間構件下的檔案拷貝到hashmap這個中間構件中。在我們電腦裡檔案任何型別的檔案都可以拷到其他任意地方。但是用來理解map這個抽象構件的就不行,因為實現map介面的類只支援放入鍵值對格式的葉子節點,如果不是(比如說arraylist)就不行,這是底層方法不支援。同時我們回到組合模式上重要的一點:一致性,map下面新增都是put方法,需要傳入兩個值,list下都是add方法,只需要傳入乙個值,如果list中的可以通過呼叫putall方法放入map裡,那麼我該怎麼給list賦key或value呢。(不是說不能有put(1,list)這樣的操作,而是說在組合模式下操作時候需要有一致性,並且這裡說的組合模式針對的是putall方法,與其他方法無關)
四、總結
這裡只是解析了hashmap中的putall組合模式。在平常寫**的過程中要使用組合模式,就需要先定義乙個抽象類或者介面。在這裡就可以看作是抽象構件,主要實現一些基本的通用的功能。接著如果有需要就要定義乙個中間構件,並且實現抽象構件,裡面的方法可以根據特殊需要重寫。而且這個類最重要的是要有儲存結構在裡面,用map儲存,或者用list儲存等等都可以。接著就是我們真正的葉子節點,同樣是繼承或實現抽象構件,裡面的方法可以根據特殊需要重寫。當你看完這篇部落格,你可以再去看定義和適用場景,說不定收穫會更大。
JDK與設計模式 組合模式
1 組合模式 組合模式有時又叫部分 整體模式在處理類似樹形結構的問 題時比較方便,組合多個物件形成樹形結構以表示具有 整體 部分 關係的層次結構。組合模式對單個物件 即葉子物件 和組合物件 即容器物件 的使用具有一致性,組合模式又可以稱為 整體 部分 part whole 模式,它是一種物件結構型模...
Spring原始碼之設計模式
一.模式 分為jdk 和cglib 前者實現介面,後者生成繼承 1.兩個參與角色 執行者和被 人 2.對於被 人來說,這件事情是一定要完成的,但是自己又不想做或者沒有時間做,找 3.需要獲取到被 人的資料。歸納 辦事要求人,所以找 二.工廠模式 分為簡單工廠 工廠方法 抽象工廠。1.對呼叫者隱藏複雜...
Junit原始碼分析 設計模式
junit的底層 主要是由觀察者模式,組合模式,模板模式,命令模式 來實現的。在junit裡首先會初始化乙個主題物件testresult物件,這個物件裡面有增加 的方法,所有的 方法都實現了 testlistener介面,這個介面會把一系統測試過程的資訊傳遞給所有的 然後 會按照它們的方式顯示給用 ...