树叶节点继承了Component抽象类,不想让它改变有点难呀,它必须实现三个抽象方法,怎么办?好办,给个空方法,如代码清单21-23所示。
代码清单21-23 树叶节点
public class Leaf extends Component {
@Deprecated
public void add(Component component){
//空实现
}
@Deprecated
public void remove(Component component){
//空实现
}
@Deprecated
public ArrayList<Component> getChildren(){
//空实现
return null;
}
}
@Deprecated
public void add(Component component){
//空实现
}
@Deprecated
public void remove(Component component){
//空实现
}
@Deprecated
public ArrayList<Component> getChildren(){
//空实现
return null;
}
}
为什么要加个Deprecated注解呢?就是告诉调用者,你可以调我这个方法,但是可能出现错误哦,我已经告诉你“该方法已经失效”了,你还使用,那就没招儿了。
在透明模式下,遍历整个树形结构是比较容易的,不用进行强制类型转换,如代码清单21-24所示。
代码清单21-24 树结构遍历
public class Client {
//通过递归遍历树
public static void display(Component root){
for(Component c:root.getChildren()){
if(c instanceof Leaf){ //叶子节点
c.doSomething();
}else{ //树枝节点
display(c);
}
}
}
}
//通过递归遍历树
public static void display(Component root){
for(Component c:root.getChildren()){
if(c instanceof Leaf){ //叶子节点
c.doSomething();
}else{ //树枝节点
display(c);
}
}
}
}
仅仅在遍历时不再进行牵制的类型转化了,其他的组装则没有任何变化。透明模式的好处就是它基本遵循了依赖倒转原则,方便系统进行扩展。