BK_Ref&DP_think
2020-01-27
chapter 7 简化
7.5 用 Composite 替换隐含树
基于数据的隐式树,往往,隐式树的代码与如何表示树的代码之间紧耦合,使用 composite 解耦,
但是,客户代码又会与 Composite 耦合。
例如 客户代码需要构造XML的Composite,有时需要通过DOM来产生XML,需要应用用Builder封装Composite重构。
1》 识别隐式叶子 implicit leaf, 隐式树中可以被建模为类的部分,这个新类就是叶子节点 leaf node, Composite:Leaf
应用提炼类或类似重构创建这个新的叶子结点类。
如果隐式叶子包含属性, 在叶子节点中也创建相同的属性,这样,整个叶子结点的表示,包括它的属性,就和隐式叶子吻合了。
对隐式树中其他可以表示为隐式叶子的部分,确保创建出的所有叶子结点都共享一个统一的接口,可以应用提炼超类或提炼接口重构生成该接口。
2》识别隐式双亲 (implicit parent) ,隐式双亲将要变成双亲结点类 Composite
客户代码必须能够为双亲结点添加叶子结点,要么通过 1 构造函数, 或者 2 add(....) 方法。 双亲结点必须统一的对待所有的子结点(例如
通过它们统一的接口)
如果双亲结点不会实现这个统一接口, 客户代码必须要能够添加。
如果不希望客户代码区分 叶子结点和双亲结点, 双亲结点必须要实现这个统一接口。
封装重复的指令,如格式化,添加或删除结点,
封装了处理相似逻辑增长的一般性方法。
简化客户代码的构造职责
当构造隐式树更简单的时候,会增加设计的复杂度。

1 package org.tech.gritRoad.BK_Ref_and_DP.chapter7.composite; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 public class TagNode { 8 9 private final String name; 10 private String value = ""; 11 private StringBuffer attribute; 12 13 private List children; 14 15 public TagNode(String nameParam) { 16 this.name = nameParam; 17 attribute = new StringBuffer(""); 18 } 19 20 public void addAttribute(String attrName, String attrVal) { 21 attribute.append(" "); 22 attribute.append(attrName); 23 attribute.append("="); 24 attribute.append("'"); 25 attribute.append(attrVal); 26 attribute.append("'"); 27 } 28 29 public void addValue(String valParam) { 30 this.value = valParam; 31 } 32 33 @Override 34 public String toString() { 35 String result; 36 result = 37 "<" + name + attribute + ">"; 38 39 // add children 40 41 Iterator it = children().iterator(); 42 while(it.hasNext()){ 43 TagNode child = (TagNode)it.next(); 44 result += child.toString(); 45 } 46 47 String parendLastPartition = this.value + "</" + this.name + ">"; 48 49 result += parendLastPartition; 50 return result; 51 } 52 53 public void add(TagNode child) { 54 children().add(child); 55 } 56 57 private List children(){ 58 if(children == null){ 59 children = new ArrayList(); 60 } 61 return children; 62 } 63 }
=====================================================================

浙公网安备 33010602011771号