JAVA的23种设计模式---组合模式

概要: 【JAVA的23种设计模式---组合模式】该文章参考了《设计模式之禅》一书及一些前辈的博客文章
1.该文章阐述了组合模式的基础原理及示例代码;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;
正文: 组合模式(合成模式、部分-整体模式):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
1.(安全模式)通用组合模式模板代码实现:

package com.csdn; /** * 抽象构件 * @author Administrator * */ public abstract class Component { //个体和整体都具有的共享 public void doSomething(){ //业务逻辑 } }

package com.csdn; import java.util.ArrayList; /** * 树枝构件 * @author Administrator * */ public class Composite extends Component{ //构件容器 private ArrayList componentArrayList = new ArrayList(); //增加一个叶子构件或树枝构件 public void add(Component component){ this.componentArrayList.add(component); } //删除一个叶子构件或树枝构件 public void remove(Component component){ this.componentArrayList.remove(component); } //获得分支下所有叶子构件或树枝构件 public ArrayList getChildren(){ return this.componentArrayList; } }

package com.csdn; /** * 树叶构件 * @author Administrator * */ public class Leaf extends Component{ public void doSomething(){ //可以重写父类方法 } }

package com.csdn; /** * 模拟场景 * @author Administrator * */ public class Client { public static void main(String[] args) { //创建一个根节点 Composite root = new Composite(); root.doSomething(); //创建一个树枝构件 Composite branch = new Composite(); //创建一个叶子节点 Leaf leaf = new Leaf(); //建立整体 root.add(branch); branch.add(leaf); } //通过递归遍历树 public static void display(Composite root){ for(Component c:root.getChildren()){ if(c instanceof Leaf){ c.doSomething(); }else{ display((Composite)c); } } } }

注:
a:组合模式包含了抽象构件角色、叶子构件、树枝构件这三种角色
b:安全模式的组合模式破坏了依赖倒转原则
c:只要是树形结构,只要是提现局部和整体关系且关系较深的时候,就考虑组合模式
d:组合模式的真实引用,它依靠了关系数据库的非对象储存性能,非常方便的保存了一个树形结构。
e:安全模式把树枝节点和树叶节点彻底分开,树枝节点拥有单独用来组合的方法,这种方法比较安全。
2.(透明模式)通用组合模式模板代码实现:
package com.csdn2; import java.util.ArrayList; /** * 抽象构件 * @author Administrator * */ public abstract class Component { //个体和整体都具有的共享 public void doSomething(){ //业务逻辑 } //增加一个叶子构件或树枝构件 public abstract void add(Component component); //删除一个叶子构件或树枝构件 public abstract void remove(Component component); //获得分支下所有叶子构件或树枝构件 public abstract ArrayList getChildren(); }

package com.csdn2; import java.util.ArrayList; /** * 树枝构件 * @author Administrator * */ public class Composite extends Component{ //构件容器 private ArrayList componentArrayList = new ArrayList(); //增加一个叶子构件或树枝构件 public void add(Component component){ this.componentArrayList.add(component); } //删除一个叶子构件或树枝构件 public void remove(Component component){ this.componentArrayList.remove(component); } //获得分支下所有叶子构件或树枝构件 public ArrayList getChildren(){ return this.componentArrayList; } }

package com.csdn2; import java.util.ArrayList; /** * 树叶节点 * @author Administrator * */ public class Leaf extends Component{ //空实现,抛不支持请求异常 @Deprecated @Override public void add(Component component) throws UnsupportedOperationException{ throw new UnsupportedOperationException(); } @Deprecated @Override public void remove(Component component) throws UnsupportedOperationException{ throw new UnsupportedOperationException(); } @Deprecated @Override public ArrayList getChildren() throws UnsupportedOperationException{ throw new UnsupportedOperationException(); } }

package com.csdn2; /** * 模拟场景 * @author Administrator * */ public class Client { public static void main(String[] args) { //创建一个根节点 Composite root = new Composite(); root.doSomething(); //创建一个树枝构件 Composite branch = new Composite(); //创建一个叶子节点 Leaf leaf = new Leaf(); //建立整体 root.add(branch); branch.add(leaf); } //通过递归遍历树 public static void display(Component root){ for(Component c:root.getChildren()){ if(c instanceof Leaf){ c.doSomething(); }else{ display(c); } } } }

注:
a:@Deprecated注解用来告诉调用者调用该方法可能会出错
b:透明模式的组合模式遵循了依赖倒转原则,但不安全
c:组合模式从下级向上级遍历,需要在抽象构件中增加setParent和getParent两个方法分别来设置父节点和获取父节点,在树枝和树叶节点set其父节点

    推荐阅读