定义(GoF《设计模式》):

将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。

及角色:
  1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component
子部件。
  2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
  3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除

(remove)等。


 public static void main(String[] args) {

         Component component=new Composite("根节点");
Component child=new Composite("一级子节点child");
Component child_1=new Leaf("一级子节点child之子节点一");
Component child_2=new Leaf("一级子节点child之子节点二");
child.add(child_1);
child.add(child_2);
Component child2=new Composite("一级子节点child2");
component.add(child);
component.add(child2);
component.foreach();
} }
abstract class Component { String name; public Component(String s){ this.name=s;
}
public abstract void add(Component c);
public abstract void remove(Component c);
public abstract void foreach();
}
//组合类
class Composite extends Component{
private List<Component>child=new ArrayList<Component>
(); public Composite(String s) {
super(s);
// TODO Auto-generated constructor stub
} @Override
public void add(Component c) {
child.add(c); } @Override
public void foreach() {
// TODO Auto-generated method stub
System.out.println("节点名:\t"+name);
for (Component c : child) {
c.foreach();
}
} @Override
public void remove(Component c) {
// TODO Auto-generated method stub
child.remove(c);
} }
//不在有根节点
class Leaf extends Component{ public Leaf(String s) {
super(s); } @Override
public void add(Component c) {
// TODO Auto-generated method stub }
@Override
public void foreach() {
System.out.println("tself name-->"+this.name);
} @Override
public void remove(Component c) {
// TODO Auto-generated method stub } }

执行结果:

节点名: 根节点
节点名: 一级子节点child
tself name-->一级子节点child之子节点一
tself name-->一级子节点child之子节点二
节点名: 一级子节点child2


什么情况下使用组合模式

引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”

参考地址:

http://blog.csdn.net/jason0539/article/details/22642281

http://blog.csdn.net/guolin_blog/article/details/9153753

http://www.2cto.com/kf/201206/137680.html

最新文章

  1. UVA, 10336 Rank the Languages
  2. css3 打勾 打叉
  3. API测试-Super Test
  4. yii过滤器的原理和使用
  5. 《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想
  6. Linux按键驱动程序设计详解---从简单到不简单【转】
  7. 强大DevExpress,Winform LookUpEdit 实现多列查询 gridview弹出下拉选择 z
  8. vue学习笔记 实例(二)
  9. sphinx随笔记了一下
  10. 使用javaMail和velocity来发送模板邮件
  11. js修改伪类元素样式
  12. Go语言嵌入类型
  13. linux 软件安装篇
  14. Office Web Apps安装部署(二)
  15. Java8简明指南
  16. Function.apply()在提升程序性能方面的技巧
  17. remote: fatal: could not read Username for &#39;http://spapa.wicp.net:3000&#39;: No such device ors
  18. ubuntu 部署wordPress
  19. 几个有用的Linux命令
  20. ABP实战--修改语言配置XML至Json

热门文章

  1. MT写的对URL操作的两个方法
  2. 【汇总】iOS开发及Xcode使用中遇到的一些报错问题汇总
  3. 即将放出ITSEC第一期所有培训视频
  4. Etl之HiveSql调优(设置map reduce 的数量)
  5. 在CodedUI中使用JQuery选择器
  6. Linux进程通信 之 信号灯(semphore)(System V &amp;&amp; POSIX)
  7. 修改mysql默认字符集的方法
  8. Java框架篇---Mybatis 构建SqlSessionFactory
  9. Windows Storage Server 2008 R2 Standard(64位)之ASM(Automated Storage Manager)管理
  10. Javascript this 关键字