==============合成模式,一种把对象组装成树结构的模式.为的是突显单独元素在整体中的位置,并且整体中的任何部分,客户端都可以平等调用(同目录和文件的区别)=====
=============安全模式,旨在不让用户调用叶子节点的管理子节点功能(因为叶子节点并没有子节点)==
=============透明模式,旨在方便用户使用,用户并不在意手里的节点是否是叶子节点,直接使用即可==
安全模式代码
/**
* @类名 Component.java
* @作者 zx
* @创建日期 2016年8月31日
* @描述 安全模式的合成模式
* @版本 V 1.0
*/
public interface Component {
void print(String preStr);
}
public class Composition implements Component {
private List<Component> components = new ArrayList<Component>();
private String name;
public Composition(String name) {
this.name = name;
}
@Override
public void print(String preStr) {
System.out.println(preStr +" " +name);
if(null != components){
for (Component component : components) {
preStr+=" ";
component.print(preStr);
}
}
}
public void addChild(Component component){
components.add(component);
}
public void remove(int index){
components.remove(index);
}
public List<Component> getChild(){
return components;
}
}
public class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void print(String preStr) {
System.out.println(name);
}
}
public class TestMain {
public static void main(String[] args) {
Composition root = new Composition("衣服");
Composition c1 = new Composition("男装");
Composition c2 = new Composition("女装");
Leaf l1 = new Leaf("西装");
Leaf l2 = new Leaf("燕尾服");
Leaf l3 = new Leaf("旗袍");
Leaf l4 = new Leaf("晚礼服");
root.addChild(c1);
root.addChild(c2);
c1.addChild(l1);
c1.addChild(l2);
c2.addChild(l3);
c2.addChild(l4);
root.print("");
}
}
透明模式的部分代码
/**
* @类名 Component.java
* @作者 zx
* @创建日期 2016年8月31日
* @描述 透明模式的合成模式
* @版本 V 1.0
*/
public abstract class Component_lucency {
abstract void print(String preStr);
public void addChild(Component component){
throw new RuntimeException("叶子节点无法调用此方法或者子节点未从写此方法");
}
public void remove(int index){
throw new RuntimeException("叶子节点无法调用此方法或者子节点未从写此方法");
}
public List<Component> getChild(){
throw new RuntimeException("叶子节点无法调用此方法或者子节点未从写此方法");
}
}
两种实现方法的选择
这里所说的安全性合成模式是指:从客户端使用合成模式上看是否更安全,如果是安全的,那么就不会有发生误操作的可能,能访问的方法都是被支持的。
这里所说的透明性合成模式是指:从客户端使用合成模式上,是否需要区分到底是“树枝对象”还是“树叶对象”。如果是透明的,那就不用区分,对于客户而言,都是Compoent对象,具体的类型对于客户端而言是透明的,是无须关心的。
对于合成模式而言,在安全性和透明性上,会更看重透明性,毕竟合成模式的目的是:让客户端不再区分操作的是树枝对象还是树叶对象,而是以一个统一的方式来操作。