《JAVA与模式》之组合模式
定义(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
《JAVA与模式》之组合模式的更多相关文章
- Java设计模式学习记录-组合模式
		
前言 今天要介绍的设计模式是组合模式,组合模式也是结构型设计模式的一种,它主要体现了整体与部分的关系,其典型的应用就是树形结构.组合是一组对象,其中的对象可能包含一个其他对象,也可能包含一组其他对象. ...
 - Java计模模式之六 ----- 组合模式和过滤器模式
		
前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...
 - java设计模式-----13、组合模式
		
Composite模式也叫组合模式,是构造型的设计模式之一.通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树. 组合(Composite)模式的其它翻译名称也很多,比如合成模式.树 ...
 - 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)
		
结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 结构 ...
 - 迭代器模式和组合模式(head first设计模式——8)
		
把迭代器模式和组合模式放在同一篇的原因是其联系比较紧密. 一.迭代器模式 1.1迭代器模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示. 这个模式提供了一种方法 ...
 - Java设计模式之《组合模式》及应用场景
		
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6489827.html 组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是 ...
 - JAVA设计模式初探之组合模式
		
先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.” 就拿剪发办卡的事情来分析一下吧. 首先,一张卡可以在总部,分店, ...
 - JAVA设计模式之【组合模式】
		
组合模式 用面向对象的方式来处理树形结构 组合多个对象形成树形结构以表示具有"整体-部分"关系的层次结构. 在组合模式中引入了抽象构件类Component,它是所有容器类和叶子类的 ...
 - 《JAVA设计模式》之组合模式(Composite)
		
在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...
 - Java设计模式(8)——结构型模式之组合模式(Composite)
		
一.概述 定义 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 简图 角色——对应上图中顶点为Component,左边为Leaf,右边为C ...
 
随机推荐
- Unity5网络模块UNet介绍
			
前段时间,研究了一下UNet,经过项目实践,大致整理了下遇到的问题. 源码Bitbucket:需要说明的是,这个项目只包含上层的包装,一些低层的网络实现在Unity内部,如NetworkTranspo ...
 - Intellij IDEA IDE部署Servlet项目
			
1.设置Project Structure 2.修改Modules中的Web项目文件默认class编译之后输出位置 3.给Modules中的Web项目添加Web模块 4.修改Web项目Web.xml文 ...
 - Spring4 MVC Hibernate4集成 Annotation
			
Spring4 MVC Hibernate4集成 Annotation 一.本文所用环境 二.工程目录 三.Maven添加依赖 四.新建数据库表 五.配置文件 六.Model层 七.DAO层 八.Se ...
 - Struts2的属性驱动与模型驱动的区别
			
1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...
 - Android之 -WebView实现离线缓存阅读
			
前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有 ...
 - Eplan 2D安装版布局,部件、端子竖放
			
部件竖放,不是通过变量的选择实现,而是通过设置实现的,具体设置在: 选项-设置-用户-2D安装板布局: 部件方向-更改为 垂直 部件放置-旋转角度-更改为90° 这样在连续放置部件的时候就变为竖放了, ...
 - Android下海康实时视频解码
			
折腾了一个多月,终于调出来了.....首先吐槽一下海康SDK,同时也感谢之... 手头有个项目,需要实时抓取海康摄像头,我是在Android下实现的,海康官网上没有Android SDK,这里友情提醒 ...
 - 转战farbox
			
好久没更新博客了,感觉在博客园这种技术为主的博客里面写太多东西写得太杂了,平时的阅读体验非常糟糕,我一直都是一个喜欢记录的人,以前经常有在笔记本上写日记的习惯,但是自从用了网上博客之后,好像就再也没有 ...
 - C/C++/Qt 统计运行时间
			
http://www.cnblogs.com/Romi/archive/2012/04/19/2457175.html 程序中经常需要统计时间,需要统计某项运算的运行时间时,需要计算时间差. 1. C ...
 - How to debug Typescript in browser
			
How to debug typescript, In Chrome, we need to press F12, open settings, uncheck the Enable JavaScri ...