1. 程式人生 > >抽象文件模式(翻譯)

抽象文件模式(翻譯)

抽象文件模式是一種面向物件結構設計模式。模式中採用key-value形式儲存物件的屬性,且確保型別不相關,暴露型別相關的屬性資料。模式的意圖是為強型別語言構建高靈活性的元件管理,保證新的屬性可以自由的新增到物件中,且不丟失型別安全。模式使用trait,將不同的屬性劃分到不同的介面中。”docuemnt”一詞來自於面向文件資料庫中( document-oriented databases)。

目錄

1. 定義

2. 結構

                2.1 虛擬碼

3. 使用場景

4. 例項

5. 參考文獻

定義

一個document是包含了若干屬性的一個物件。舉個例子,一個屬性可以為字串,或者多個其他document。每個屬性都需要通過一個key來獲取。當遍歷構建document樹時,使用者需要為下一級的實現類指定構造器。實現類通常是一些實現了document介面的實現類的集合,從而使這些物件能夠自己處理屬性的獲取和設定。

結構

介面”Document”確保屬性可以通過put方法設定,通過get方法獲取,並且子document可以通過children方法訪問。children方法可以提供一個型別相關的child,且此child能夠提供自身資料的map。map需要指向源資料,這樣所有的修改都能夠體現到源物件上。 實現類可以繼承自多個描述不同屬性的trait介面。甚至多個document可以共享一個map。實現類唯一的限制是,除了從基礎元件繼承的屬性,其他屬性必須是無狀態了。
輸入圖片說明

虛擬碼

interface Document
put(key : String, value : Object) : Object
get(key : String) : Object
children(key : String, constructor : Map

使用場景

抽象文件模式允許開發者將屬性儲存到無型別的屬性樹種,且對document使用型別相關的操作。新的檢視,或者供替代的檢視實現可以在不影響結構的情況下隨意建立。 模式的優勢在於提供了一個鬆耦合的物件,但這也增加了型別轉換的風險–繼承的屬性型別並不是必然的

例項

Document.java

public interface Document {
Object put(String key, Object value);
Object get(String key);
Stream children(
String key,
Function

參考文獻

Forslund, Emil (2016-01-15). “Age of Java: The Best of Both Worlds”. Ageofjava.blogspot.com. Retrieved 2016-01-23. Jump up ^ Fowler, Martin. “Dealing with Properties” (PDF). Retrieved 2016-01-29.

模式理解

1. 所有的屬性都通過Map<String,Object>儲存。所以儲存的時候不需要關心具體的型別是什麼。
2. 物件可以有子物件。比如,Car有Wheel,door。wheel和door都是子物件。通過car可以獲得whell和door子物件,通過子物件設定和獲取子物件的屬性。
3. 通過繼承介面,實現獲取型別相關的屬性。Car繼承並實現介面HasModel。如果想獲得Car的model屬性,需要呼叫HasModel.getModel。從而實現取出的屬性型別相關。
4. 通過基類封裝基本操作。這樣不同Car或者Car和Plane之間可以共享實現。