什麼是抽象文件模式?
文件是包含許多屬性的物件,而屬性可以是數字或字串之類的值,也可以是其他文件的列表。使用鍵Key引用每個屬性。當遍歷文件樹時,使用者指定用於建立下一級別的實現類的建構函式。這些實現通常是擴充套件Document介面的各種特性的聯合,使它們可以自己處理設定和獲取屬性。
“文件Document”表示可以使用“put”方法編輯屬性,使用“get”方法讀取,可以使用“children”方法遍歷子文件。“children”方法需要對一個方法的功能性引用,該方法可以在給定子項應具有的資料的對映的情況下生成子型別的檢視。Map應該是指向原始Map的指標,以便檢視中的更改也會影響原始文件。
實現可以從描述不同屬性的多個特徵介面繼承。多個實現甚至可以共享相同的對映,模式對實現設計的唯一限制是它必須是 無狀態的, 除了從“BaseDocument”繼承的屬性。
抽象文件模式允許開發人員在非型別化樹結構中儲存配置設定等變數,並使用型別化檢視對文件進行操作。可以在不影響內部文件結構的情況下建立檢視的新檢視或替代實現。這樣做的優點是系統更鬆散耦合,但它也增加了轉換錯誤的風險,因為屬性的繼承型別並不總是確定的。
Document.java
<b>public</b> <b>interface</b> Document { Object put(String key, Object value); Object get(String key); <T> Stream<T> children( String key, Function<Map<String, Object>, T> constructor ); }
BaseDocument.java
<b>public</b> <b>abstract</b> <b>class</b> BaseDocument implements Document { <b>private</b> <b>final</b> Map<String, Object> entries; <b>protected</b> BaseDocument(Map<String, Object> entries) { <b>this</b>.entries = requireNonNull(entries); } @Override <b>public</b> <b>final</b> Object put(String key, Object value) { <b>return</b> entries.put(key, value); } @Override <b>public</b> <b>final</b> Object get(String key) { <b>return</b> entries.get(key); } @Override <b>public</b> <b>final</b> <T> Stream<T> children( String key, Function<Map<String, Object>, T> constructor) { <b>final</b> List<Map<String, Object>> children = (List<Map<String, Object>>) get(key); <b>return</b> children == <b>null</b> ? Stream.empty() : children.stream().map(constructor); } }
Usage.java
Map<String, Object> source = ...; Car car = <b>new</b> Car(source); String model = car.getModel(); <b>int</b> price = car.getPrice(); List<Wheel> wheels = car.children(<font>"wheel"</font><font>, Wheel::<b>new</b>) .collect(Collections.toList()); </font>
什麼時候使用抽象文件模式?
- 需要動態新增新屬性
- 你想要一種靈活的方式來組織樹狀結構中的域
- 你想要更鬆散耦合的系統