转载请注明地址:http://blog.csdn.net/droyon/article/details/21228537
组合模式:允许你将对象组合成树形结构来表现 “整体/部分” 层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式解决了整体与部分一致对待的问题。
透明方式:叶子结点和分支节点继承自同一父类,叶子和分支具有同一接口。优点:叶子结点和分支节点对外界没有区别可以统一接口调用,缺点:父类方法在叶子中实现无意义。
安全方式:叶子接口不实现父类方法,这种方式接口带外界不透明,在使用时需要增加判断逻辑。不推荐。
类图:
案例代码:
行为方法.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'
组合模式不用关心处理的是叶子节点还是分支节点,不用为定义组合使用判断语句语句。