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 }

=====================================================================

 

posted @ 2020-01-27 21:27  君子之行  阅读(26)  评论(0)    收藏  举报