组合模式:允许你将对象组合成树形结构来表现 “整体/部分” 层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式解决了整体与部分一致对待的问题。
透明方式:叶子结点和分支节点继承自同一父类,叶子和分支具有同一接口。优点:叶子结点和分支节点对外界没有区别可以统一接口调用,缺点:父类方法在叶子中实现无意义。
安全方式:叶子接口不实现父类方法,这种方式接口带外界不透明,在使用时需要增加判断逻辑。不推荐。
类图:

案例代码:
行为方法.java
package 组合模式;
import java.util.ArrayList;
public abstract class 行为类 {
protected ArrayList<行为类> mList = new ArrayList<行为类>();
protected String name;
public 行为类(String name){
this.name = name;
}
public abstract void add(行为类 component);
public abstract void remove(行为类 component);
public abstract void Display(String subTab);
}
分支类.java
package 组合模式;
public class 分支类 extends 行为类{
public 分支类(String name) {
super(name);
}
@Override
public void add(行为类 component) {
mList.add(component);
}
@Override
public void remove(行为类 component) {
mList.remove(component);
}
@Override
public void Display(String subTab) {
System.out.println(subTab+'+name+');
for(行为类 b:mList){
b.Display(subTab+-);
}
}
}
叶子类.java
package 组合模式;
public class 叶子类 extends 行为类{
public 叶子类(String name) {
super(name);
}
@Override
public void add(行为类 component) {
}
@Override
public void remove(行为类 component) {
}
@Override
public void Display(String subTab) {
System.out.println(subTab+'+name+');
}
}
组合模式测试类
package 组合模式;
/**
*
* 叶子a 叶子b
* /
* |
* 枝干A 枝干B
* /
* |
* 我是大树
* @author wanghl
*
*/
public class 组合模式 {
public static void main(String args[]){
分支类 大树 = new 分支类(我是大树);
分支类 枝干A = new 分支类(枝干A);
分支类 枝干B = new 分支类(枝干B);
大树.add(枝干A);
大树.add(枝干B);
叶子类 叶子A1a = new 叶子类(枝干A1的叶子a);
叶子类 叶子A1b = new 叶子类(枝干A1的叶子b);
枝干A.add(叶子A1a);
枝干A.add(叶子A1b);
大树.Display(-);
System.out.println(-----------------------------------------);
分支类 大枣树 = new 分支类(我是大枣树);
分支类 枝干 = new 分支类(枣树枝干);
叶子类 大枣1 = new 叶子类(大枣1);
叶子类 大枣2 = new 叶子类(大枣2);
叶子类 大枣3 = new 叶子类(大枣3);
枝干.add(大枣1);
枝干.add(大枣2);
枝干.add(大枣3);
大枣树.add(枝干);
大枣树.Display(-);
}
}
打印输出:
-'我是大树' --'枝干A' ---'枝干A1的叶子a' ---'枝干A1的叶子b' --'枝干B' ----------------------------------------- -'我是大枣树' --'枣树枝干' ---'大枣1' ---'大枣2' ---'大枣3'
总结:
组合模式不用关心处理的是叶子节点还是分支节点,不用为定义组合使用判断语句语句。