转载请注明地址: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); }
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‘
组合模式不用关心处理的是叶子节点还是分支节点,不用为定义组合使用判断语句语句。
原文:http://blog.csdn.net/droyon/article/details/21228537